如果参数包含另一个mock,则断言mock参数



我有一个函数,例如:

def my_function1(my_obj, my_arg):
# do something
return

在我的单元测试中,我想测试第二个函数是否用指定的参数调用这个函数:

def my_function2():
obj1 = SomeClassObject()
for arg in ["a", "b", "c"]:
my_function1(obj1, arg)

为了测试,我模拟了对象SomeClassObject。我还模拟了my_function1,这样我就可以监视它是如何被调用的。所以我的单元测试看起来是这样的:

import unittest
from unittest.mock import patch, call
class MyTest(unittest.TestCase):
@patch("__main__.SomeClassObject", autospec=True)
@patch("__main__.my_function1")
def test_my_function2_calls_my_function1(self, mock_function1, mock_class_object):
my_function2()
calls = [call(mock_class_object, "a"),
call(mock_class_object, "b"),
call(mock_class_object, "c")]
mock_function1.assert_has_calls(calls)

但这三次出现以下错误:

断言错误:(TypeError("缺少必需的参数:'my_arg'"(

我使用交互式调试器进行了调试,发现mock_function1._mock_call_args_list

[call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'a'),
call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'b'),
call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'c')]

这与我打印call(mock_class_object, "a")等时得到的内容相同。id完全相同。所以当我运行.assert_has_calls时,MagicMock对象会把事情搞砸。

有人知道我该怎么做吗?

我不确定为什么会收到错误消息,但您测试的是类而不是对象作为参数。这是应该工作的:

class MyTest(unittest.TestCase):
@patch("__main__.SomeClassObject", autospec=True)
@patch("__main__.my_function1")
def test_my_function2_calls_my_function1(self, mock_function1, mock_class):
my_function2()
mock_class_object = mock_class.return_value
calls = [call(mock_class_object, "a"),
call(mock_class_object, "b"),
call(mock_class_object, "c")]
mock_function1.assert_has_calls(calls)

最新更新