У меня есть следующий файл, 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
, и побочный эффект в макете делает то же самое.При первоначальном добавлении в стек вызовов переменная состояния пуста.Однако, когда он изменяется побочным эффектом, он имеет (непреднамеренный) побочный эффект изменения объекта в стеке вызовов.В результате утверждение не выполняется.
Я локально изменил эту строку , чтобы она была
import copy
_call = _Call(copy.deepcopy((args, kwargs)), two=True)
Когда я это сделал, тест прошел.
Любые идеи о том, как я могу решить эту проблему без изменения библиотеки mock
?