Насмешка над функцией, которая изменяет входной аргумент в python - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующий файл, 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?

...