即使@ 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()關心所有的調用....我現在正在閱讀你的新評論:這完全是關於命名。這是明確你想要聲明的。無論如何,您可以精確選擇您想要做的事情,查看訂單與否,檢查確切的所有電話或只是一個子集。 –