from mock import Mock
j = []
u = Mock()
u(j)
# At this point u.call_args_list == [call([])]
print u.call_args_list
j.append(100)
# At this point u.call_args_list == [call([100])], but I expect it to be [call([])], since it was never called when j had a value of 100 in it
print u.call_args_list
我的问题是我如何确保u.call_args_list
中的调用包含调用模拟时的所有对象的状态,而不是在检查模拟的参数时?
我现在用的是mock==1.0.1
这将在文档26.6.3.7节中讨论。处理可变参数。
不幸的是,他们并没有真正优雅地解决这个问题!推荐的解决方法是使用side_effect
从可变参数中复制元素。
如果您为模拟提供了一个side_effect函数,那么side_effect将使用与模拟相同的参数被调用。这使我们有机会复制参数并存储它们以供以后的断言使用。
在我看来,实现起来有点混乱。如果您需要在多个地方使用该功能,您可能更喜欢子类化Mock
并直接添加该功能:
from copy import deepcopy
class CopyingMock(MagicMock):
def __call__(self, *args, **kwargs):
args = deepcopy(args)
kwargs = deepcopy(kwargs)
return super(CopyingMock, self).__call__(*args, **kwargs)
2017:它现在可以在第三方发行版(pip install copyingmock
)中使用。
>>> from copyingmock import CopyingMock
>>> mock = CopyingMock()
>>> list_ = [1,2]
>>> mock(list_)
<CopyingMock name='mock()' id='4366094008'>
>>> list_.append(3)
>>> mock.assert_called_once_with([1,2])
>>> mock.assert_called_once_with(list_)
AssertionError: Expected call: mock([1, 2, 3])
Actual call: mock([1, 2])