Python unittest mock:是否可以在测试时模拟__init __的默认参数的值?

时间:2018-05-29 17:06:27

标签: python unit-testing mocking

我想通过在单元测试期间替换默认参数的值来测试使用默认参数创建的类。

例如,我想要以下行(整个代码) obj = SomeClass()

看起来像是用参数

调用的

obj = SomeClass(overiden_parameter)

一种解决方案可能是创建简单的子类:

``` def OriginalClass(object):

def __init_(some_param="default_value"):
    ...

```

``` def MockedOriginalClass(OriginalClass):

def __init_():
    super(MockedOriginalClass, self).__init__("some_other_value)
    ...

```

如何在代码中使用模拟/补丁OriginalClassMockedOriginalClass?请记住,我确实希望保留原始类的功能,我唯一要改变的是它的默认__init__参数。

我觉得这对Mocking来说是一件非常简单的事情,我还没有完全弄明白该怎么做。

我发现了这个问题: Python unittest mock: Is it possible to mock the value of a method's default arguments at test time?

它非常接近,但我不认为同样的技巧可以应用于__init__方法。

2 个答案:

答案 0 :(得分:1)

这样做的一种方法是通过模拟整个类来为您进行特定的测试:

实施例: 我有一个我想要模拟的类SomeClass。我的模拟类名是MockSomeClass,它将模拟类SomeClass。

class MockSomeClass(SomeClass):
    '''
    Mock Class
    '''
    def __init__(overiden_parameter):
        self.overiden_parameter = overiden_parameter

因此在测试期间,您将使用具有重写功能的mock类,而其他函数行为将保持相同(继承)。

修补

mock_some_class_obj = MockSomeClass()

@mock.patch('SomeClass', return_value=mock_some_class_obj)
def test1(self, mock_some_class_obj):
'''
Test 1
'''
    obj = SomeClass()

catch 所以在代码中,只要你创建SomeClass的对象,就会返回mock类的对象。在mock类中,您可以添加自己的功能。

答案 1 :(得分:0)

请查看@Martinj Pieters评论,但也可以使用pytest https://en.wikipedia.org/wiki/Monkey_patch支持的猴子修补https://docs.pytest.org/en/documentation-restructure/how-to/monkeypatch.html来覆盖__init__方法。

相关问题