Python Unittesting收集通过测试更改的值
我有几个函数将dict作为参数并返回修改后的dict。在我的单元测试中,我想通过检查模拟调用的参数来测试函数的输入是否正确。但这样做后,在测试函数中进行所有修改后,我得到的是dict状态,而不是模拟函数调用时的状态。似乎mock使用对象链接保存调用的参数,而不是Python Unittesting收集通过测试更改的值,python,python-unittest,Python,Python Unittest,我有几个函数将dict作为参数并返回修改后的dict。在我的单元测试中,我想通过检查模拟调用的参数来测试函数的输入是否正确。但这样做后,在测试函数中进行所有修改后,我得到的是dict状态,而不是模拟函数调用时的状态。似乎mock使用对象链接保存调用的参数,而不是copy()。我怎样才能避免呢?我错过什么了吗 # app.py def dict_modificator(inp_dict): inp_dict['foobar'] = 123 return inp_dict def
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}
您可以在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
是的,自制的args/kwargs复制副作用或decorator可能是一个不错的解决办法,但我正在寻找是否有任何std-lib解决方案。