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

2024-10-01 05:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,我想要下面一行(在整个代码中) obj = SomeClass()

看起来像是用参数调用的

obj = SomeClass(overiden_parameter)

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

你知道吗``` 定义原始类(对象):

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

````

你知道吗``` def MockedOriginalClass(原始类):

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

````

如何模拟/修补OriginalClass成为MockedOriginalClass的代码?请记住,我确实希望保留原始类的功能,唯一需要更改的是它的默认__init__参数。你知道吗

我觉得这是一个非常简单的事情来做嘲笑,我只是不太明白如何做到这一点。你知道吗

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

这很接近,但我不认为同样的技巧可以应用于__init__方法。你知道吗


Tags: 代码objdefault参数parameterinitvaluedef
2条回答

其中一种方法是模拟整个类进行特定的测试,如下所示:

示例: 我有一门课,我想嘲笑。我的模拟类名是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()

捕获因此,在代码中,无论何时创建SomeClass的对象,都将返回mock类的对象。在mock类中,您可以添加自己的功能。你知道吗

看看@Martinj Pieters comment,但是也可以使用pytesthttps://docs.pytest.org/en/documentation-restructure/how-to/monkeypatch.html中支持的monkey patchinghttps://en.wikipedia.org/wiki/Monkey_patch来重写__init__方法。你知道吗

相关问题 更多 >