Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Unittesting收集通过测试更改的值_Python_Python Unittest - Fatal编程技术网

Python Unittesting收集通过测试更改的值

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

我有几个函数将dict作为参数并返回修改后的dict。在我的单元测试中,我想通过检查模拟调用的参数来测试函数的输入是否正确。但这样做后,在测试函数中进行所有修改后,我得到的是dict状态,而不是模拟函数调用时的状态。似乎mock使用对象链接保存调用的参数,而不是
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解决方案。