我有几个函数将dict作为参数并将其修改后返回。在单元测试中,我想通过检查模拟调用的参数来测试函数的输入是否正确。但是这样做是在经过测试的函数中进行所有修改之后,我得到的是dict状态,而不是模拟函数调用时的状态。似乎模拟使用对象链接而不是copy()
保存调用的参数。我该如何避免呢?我想念什么吗?
# app.py
def dict_modificator(inp_dict):
inp_dict['foobar'] = 123
return inp_dict
def tested_function():
inp_dict = {'spam': 'eggs'}
inp_dict = dict_modificator(inp_dict)
inp_dict['ham'] = 456
# unittest.py
class MyTestCase(unittest.TestCase):
def test_it(self):
dict_modificator_mock = Mock(wraps=app.dict_modificator)
with patch("app.dict_modificator", dict_modificator_mock):
app.tested_function()
args, _ = dict_modificator_mock.call_args
self.assertEqual({'spam': 'eggs'}, args[0])
# AssertionError: {'spam': 'eggs'} != {'spam': 'eggs', 'foobar': 123, 'ham': 456}
答案 0 :(得分:1)
您可以在Mock上使用副作用,以复制传入的字典
class MyTestCase(unittest.TestCase):
def test_it(self):
copy = {}
def make_copy(x):
for k, v in x.items():
copy[k] = v
return DEFAULT
dict_modificator_mock = Mock(wraps=test.dict_modificator)
dict_modificator_mock.side_effect = make_copy
# copy = {'spam': 'eggs'}
# use copy in your assertion