我有一个函数,例如:
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)