通过测试更改单元测试集合的值

时间:2018-12-14 15:41:13

标签: python python-unittest

我有几个函数将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}

1 个答案:

答案 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