初期状態ではサポートされていないようです。ただし、同じ結果を得る方法については、少なくとも 2 つのアプローチがあります。
許可されたメンバーの受け渡しリスト
モックドキュメントによると
spec : これは、文字列のリストまたはモック オブジェクトの仕様として機能する既存のオブジェクト (クラスまたはインスタンス) のいずれかです。オブジェクトを渡すと、オブジェクトで dir を呼び出すことによって文字列のリストが形成されます (サポートされていないマジック属性とメソッドを除く)。このリストにない属性にアクセスすると、 AttributeError が発生します。
したがって、テスト例を失敗させるには、単に置き換えます
actionMock = mock.create_autospec(Action)
に
actionMock = mock.Mock(spec=['step1'])
このようなアプローチには、クラスまたはインスタンスをspec
引数として渡す場合と比較して、特定の欠点があります。許可されているすべてのメソッドを渡し、それらに期待を設定して、それらを効果的に 2 回登録する必要があるためです。また、メソッドのサブセットを制限する必要がある場合は、それらを除くすべてのメソッドのリストを渡す必要があります。これは次のようにして実現できます。
all_members = dir(Action) # according to docs this is what's happening behind the scenes
all_members.remove('step2') # remove all unwanted methods
actionMock = mock.Mock(spec=all_members)
制限されたメソッドに例外を設定する
別のアプローチは、呼び出されたくないメソッドに明示的に失敗を設定することです。
def test_algorithm(self):
actionMock = mock.create_autospec(Action)
actionMock.step2.side_effect = AttributeError("Called step2") # <<< like this
self.assertTrue(algorithm(actionMock))
actionMock.step1.assert_called_once_with('111')
これにはいくつかの制限もあります。エラーと期待値を設定する必要があります。
最後に、この問題に対する根本的な解決策の 1 つは、パッチを適用してコンストラクターにパラメーターをmock
追加し、プル リクエストを送信することです。それが受け入れられるか、メンテナーがそれを達成する方法を指摘するよりも。:)strict
Mock
mock