即使@ MartinPieters的回答是正确的我认为这不是最好的办法。模拟提供assert_has_calls
做这种职责。
您的测试可能是:
function.assert_has_calls([mock.call(1, 2), mock.call(2, 3)])
凡mock.call
是一个辅助类做这些行业的工作经验。
注重这是一个有呼叫,是指通话清单应在通话清单和不相等。为了解决这个问题,我通常定义自己的助手assert_is_calls()
如下
def assert_is_calls(m, calls, any_order=False):
assert len(m.mock_calls) == len(calls)
m.assert_has_calls(calls, any_order=any_order)
那一份简历例子
>>> import mock
>>> f = mock.Mock()
>>> f(1)
<Mock name='mock()' id='139836302999952'>
>>> f(2)
<Mock name='mock()' id='139836302999952'>
>>> f.assert_has_calls([mock.call(1), mock.call(2)])
>>> f.assert_has_calls([mock.call(2), mock.call(1)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/damico/.local/lib/python2.7/site-packages/mock/mock.py", line 969, in assert_has_calls
), cause)
File "/home/damico/.local/lib/python2.7/site-packages/six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call(2), call(1)]
Actual: [call(1), call(2)]
>>> f.assert_has_calls([mock.call(2), mock.call(1)], any_order=True)
>>> f(3)
<Mock name='mock()' id='139836302999952'>
>>> f.assert_has_calls([mock.call(2), mock.call(1)], any_order=True)
>>> f.assert_has_calls([mock.call(1), mock.call(2)])
>>> assert len(f.mock_calls)==2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert len(f.mock_calls)==3
>>> def assert_is_calls(m, calls, any_order=False):
... assert len(m.mock_calls) == len(calls)
... m.assert_has_calls(calls, any_order=any_order)
...
>>> assert_is_calls(f, [mock.call(1), mock.call(2), mock.call(3)])
>>> assert_is_calls(f, [mock.call(1), mock.call(3), mock.call(2)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in assert_is_calls
File "/home/damico/.local/lib/python2.7/site-packages/mock/mock.py", line 969, in assert_has_calls
), cause)
File "/home/damico/.local/lib/python2.7/site-packages/six.py", line 718, in raise_from
raise value
AssertionError: Calls not found.
Expected: [call(1), call(3), call(2)]
Actual: [call(1), call(2), call(3)]
>>> assert_is_calls(f, [mock.call(1), mock.call(3), mock.call(2)], True)
>>> assert_is_calls(f, [mock.call(1), mock.call(3)], True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in assert_is_calls
AssertionError
>>>
'assert_has_calls'不关心*所有*的呼叫。你可以给它一个子集,它会返回true。如果你想断言这些只是** **电话,那么你需要使用我的方法。 –
你的包装函数,默认为'any_order = False',它有效地做和'assertEquals(m.mock_calls,调用)'一样的东西,那么为什么这个额外的函数呢?该功能不会为你购买任何额外的东西.. –
@MartijnPieters是的,这是因为我提到我自己的helper assert_is_calls()关心所有的调用....我现在正在阅读你的新评论:这完全是关于命名。这是明确你想要声明的。无论如何,您可以精确选择您想要做的事情,查看订单与否,检查确切的所有电话或只是一个子集。 –