我试图将初始化对象的值覆盖为单元测试的预设值。我长时间使用模拟库和 pytest。
这是演示问题的代码:
def function_to_test():
new_object = Object(arg1, arg2, arg3)
return func1(new_object)
对于这个函数,我想测试对象是否用
arg1
、arg2
和 arg3
初始化,但我也想修补 new_object
的值,这样我就可以测试 func1
是使用特定参数进行调用。
我当前的测试是这样的:
def test_function_to_test(mocker):
mocker.patch(Object.__init__, return_value=None)
mocker.patch(func1)
function_to_test()
Object.__init__.assert_called_once_with(arg1, arg2, arg3)
mock_object = "test"
func1.assert_called_once_with(mock_object) # this line fails
对于要传递的最后一行,需要将 new_object 的值修补为预设值。我尝试更改
return_value
来修补初始化程序,但由于 __init__
函数不返回任何内容,因此出现错误。有没有办法让“Object”的初始化返回预定义的值?
不要设置返回值,只让它生成mock。然后在后续断言中使用返回值。它看起来像这样:
from mymod import function_to_test
def test_function_to_test(mocker):
mock_Object = mocker.patch("mymod.Object")
mock_func1 = mocker.patch("mymod.func1")
function_to_test()
mock_Object.assert_called_once_with(arg1, arg2, arg3)
mock_func1.assert_called_once_with(mock_Object.return_value)