複数 - python mock 関数




モックメソッドへの連続呼び出しのアサート (3)

Mock.call_args_list属性を使用すると、以前のメソッド呼び出しとパラメータを比較できます。 それはcall_countと一緒にあなたに完全な制御を与えるはずです。

Mockは役に立つassert_called_with()メソッドを持っています 。 しかし、私が理解する限り、これはメソッドへの最後の呼び出しをチェックするだけです。
異なるパラメータを使用するたびに、模擬メソッドを3回連続して呼び出すコードがある場合、これらの3つの呼び出しを特定のパラメータでどのようにアサートすることができますか?


assert_has_callsは、この問題に対する別のアプローチです。

ドキュメントから:

assert_has_calls (呼び出し、any_order = False)

指定された呼び出しでモックが呼び出されたことをアサートします。 mock_callsリストの呼び出しがチェックされます。

any_orderがFalse(デフォルト)の場合、呼び出しは順次でなければなりません。 指定された呼び出しの前後に余分な呼び出しがある可能性があります。

any_orderがTrueの場合、呼び出しは任意の順序で実行できますが、すべてがmock_callsに表示されている必要があります。

例:

>>> from mock import call, Mock
>>> mock = Mock(return_value=None)
>>> mock(1)
>>> mock(2)
>>> mock(3)
>>> mock(4)
>>> calls = [call(2), call(3)]
>>> mock.assert_has_calls(calls)
>>> calls = [call(4), call(2), call(3)]
>>> mock.assert_has_calls(calls, any_order=True)

出典: http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.assert_has_calls : http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.assert_has_calls


通常、通話の順番は気にせず、起きただけです。 その場合、私はassert_any_callcall_countに関するアサーションを組み合わせます。

>>> import mock
>>> m = mock.Mock()
>>> m(1)
<Mock name='mock()' id='37578160'>
>>> m(2)
<Mock name='mock()' id='37578160'>
>>> m(3)
<Mock name='mock()' id='37578160'>
>>> m.assert_any_call(1)
>>> m.assert_any_call(2)
>>> m.assert_any_call(3)
>>> assert 3 == m.call_count
>>> m.assert_any_call(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "[python path]\lib\site-packages\mock.py", line 891, in assert_any_call
    '%s call not found' % expected_string
AssertionError: mock(4) call not found

私は読んで理解しやすくするために、単一のメソッドに渡される呼び出しの大きなリストよりも、このようにしています。

オーダーを気にしたり、複数の同一の呼び出しが必要な場合は、 http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.assert_has_callsが適切かもしれません。

編集

私はこの回答を投稿して以来、私は一般的なテストへの私のアプローチを考え直しました。 私はあなたのテストがこの複雑さを増しているなら、あなたは不適切にテストしているかもしれないし、デザインに問題があるかもしれないと言及する価値があると思います。 モックは、オブジェクト指向設計におけるオブジェクト間通信をテストするために設計されています。 あなたのデザインが(より手続き的または機能的なように)オブジェクト指向でない場合、モックは完全に不適切かもしれません。 また、メソッドの内部で処理が多すぎる可能性があります。または、モロックされていない状態で内部の詳細をテストしている可能性があります。 コードがあまりオブジェクト指向ではないときに、この方法で述べた戦略を開発しました。また、最良の状態になっていたであろう内部の詳細もテストしていたと思います。





mocking