他の回答から判断すると、 @rob-kennedy以外の誰もがについて話しませんでしたcall_args_list
。
これは、正反対の実装を実行できる強力なツールです。MagicMock.assert_called_with()
call_args_list
call
オブジェクトのリストです。各call
オブジェクトは、モックされた呼び出し可能オブジェクトに対して行われた呼び出しを表します。
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m.call_args_list
[]
>>> m(42)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42)]
>>> m(42, 30)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42), call(42, 30)]
オブジェクトの消費call
は簡単です。長さ2のタプルと比較できるためです。最初のコンポーネントは関連する呼び出しのすべての位置引数を含むタプルであり、2番目のコンポーネントはキーワード引数の辞書です。
>>> ((42,),) in m.call_args_list
True
>>> m(42, foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((42,), {'foo': 'bar'}) in m.call_args_list
True
>>> m(foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((), {'foo': 'bar'}) in m.call_args_list
True
したがって、OPの特定の問題に対処する方法は次のとおりです。
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
このように、モックされたcallableが呼び出されたかどうかを確認するだけでなく、を介しMagicMock.called
て、特定の引数のセットで呼び出されたかどうかを確認できるようになりました。
それは便利です。compute()
リストを取得する関数をテストし、特定の条件を満たす場合にのみ、リストの値ごとに別の関数を呼び出すとします。
これで、モックcompute
を作成して、ある値で呼び出されたが他の値では呼び出されていないかどうかをテストできます。