模拟修改python中输入参数的函数

时间:2018-06-25 23:04:59

标签: python unit-testing mocking python-unittest python-mock

我有以下文件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'})

参数statemodify_in_place修改,并且模拟中的副作用也发生了同样的事情。最初将其添加到调用堆栈时,状态变量为空。但是,当它被副作用修改时,它具有在调用堆栈上修改对象的(意外)副作用。结果,断言失败。

我将this line本地修改为

import copy
_call = _Call(copy.deepcopy((args, kwargs)), two=True)

当我这样做时,测试通过了。

关于如何无需修改mock库就可以解决此问题的任何想法?

0 个答案:

没有答案
相关问题