我有以下文件main.py
:
def modify_in_place(obj):
obj['foo'] = 'bar'
def foo(obj):
modify_in_place(obj)
我对此也有一个测试:
import main
import unittest
from mock import patch
def side_effect(s):
s.update(foo='bar')
class MainTest(unittest.TestCase):
@patch('main.modify_in_place', side_effect=side_effect):
def test_foo(self):
state = {}
main.modify_in_place(state)
m_fn.assert_called_once_with({})
self.assertEqual(state, {'foo': 'bar'})
但是,这将返回以下错误:
AssertionError: Expected call: fn({})
Actual call: fn({'foo': 'bar'})
参数state
被modify_in_place
修改,并且模拟中的副作用也发生了同样的事情。最初将其添加到调用堆栈时,状态变量为空。但是,当它被副作用修改时,它具有在调用堆栈上修改对象的(意外)副作用。结果,断言失败。
我将this line本地修改为
import copy
_call = _Call(copy.deepcopy((args, kwargs)), two=True)
当我这样做时,测试通过了。
关于如何无需修改mock
库就可以解决此问题的任何想法?