問題タブ [python-unittest.mock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Mock インスタンス メソッドから TestCase インスタンス メソッドにアクセスするには?
TL;DR
unittest.TestCase
インスタンスを明示的に渡さずに、モック クラスのメソッド内から現在のインスタンスにアクセスできますか? TestCase
そうでない場合、そこから (インスタンス メソッドである)のアサーション ヘルパー関数にアクセスする適切な方法は何ですか? (いい方法はありますか?)
シナリオ:MagicMock
メソッドに基づく独自のアサーション メソッドによるTestCase
拡張
handle_multiple_foobars()
ある関数 ( ) が別の関数 ( handle_one_foobar()
) を正しく使用していることをテストしたいので、 をモックしてhandle_one_foobar()
います。ここで「正しく」とは、各引数を個別にhandle_multiple_foobars()
呼び出すことを意味します。handle_one_foobar()
(引数handle_one_foobar()
ごとに 1 つの呼び出しhandle_multiple_foobars()
。) 呼び出しの順序は気にしません。
モックへの予想されるすべての呼び出しが行われたかどうかを確認する
したがって、私はこれから始めました:
モックへの予想される呼び出しのみが行われたかどうかを確認する
ただし、これは、モックされた関数への呼び出しがさらにある場合にも合格します。
私はそれをしたくありません。
追加のアサーション (または追加のテスト) を簡単に作成して、呼び出しの合計数を確認できます。しかし、これをテストする単一の条件として扱いたいと思います。だから私は別のアサーションを構築しました:
これにより、追加の呼び出しがうまくキャッチされます。
新しいアサーションをモックのヘルパー メソッドに移動します
しかし、私の好みでは、ここで主張されていることは十分に明白ではありません。したがって、アサーションを新しい関数に抽出することにしました。この関数は と非常によく似た目的を果たすためassert_has_calls()
、モック クラスのメソッドであるべきだと思います。拡張するのは難しくなくMagicMock
、抽出されたメソッドをもう少し汎用的にして、呼び出し順序が重要かどうかを指定できるようにすることもできます。
@patch
unittest.mock.MagicMock
テストメソッドの装飾を次のように変更すると、モックを作成する代わりにこのクラスを使用します
次に、アサーションを次のように書くことができます
...そして醜い
しかし、非常に醜いことに気づいたかもしれません:TestCase
インスタンス メソッドassertCountEqual()
とを使用できるようにするために、テストが実行される実際のインスタンスではないassertEqual()
ダミー インスタンスを作成しました。TestCase
FoobarHandlingTest
どうすればこれを回避できますか?
明らかに、テストself
をアサーション メソッドに渡すことはできますが、それは非常に非直感的なシグネチャになります。(テスト ケースについてアサーションを伝える必要があるのはなぜですか?)
python - UnitTest Python Mock メソッドへの最初の呼び出し、2 番目の呼び出しは通常どおりに行われます
私はメソッドを嘲笑しています。最初の呼び出しで例外を発生させたいのですが、例外でそのメソッドを別のパラメーターで再度呼び出しているため、2 回目の呼び出しは正常に処理されるようにしたいと考えています。私は何をする必要がありますか?
コード
1を試す
トライ2
2 回目の呼び出しでsome_method
は、 がそのまま返され、データは別のパラメーターで処理されません。
python - unittest.mock 呼び出し引数を、それらが位置引数またはキーワード引数として渡されたかどうかに関係なくチェックします
オブジェクトが呼び出されるunittest.mock.Mock
と、呼び出しの正確な署名で引数の値を確認できます。
同じ値を持つ別の署名のチェックは失敗します。'baz'
たとえば、名前付き引数の代わりに位置引数としてチェックすると、アサーションは失敗します。
それはしなければなりません。置き換えられた関数m
が
その場合、呼び出しは同等になりますが、
その場合、呼び出しは同等ではありません。Mock
は実際の関数のシグネチャを知らないため、最初のケースでの等価性に依存できません。
モック (またはアサーション ヘルパー関数など) にモックによって置き換えられた実際の関数を知らせることによって、それらが位置的に渡されたのか、キーワード引数として渡されたのかにとらわれない呼び出し引数の値をチェックする方法はありますか?
オプションの引数またはautospeccingMock
を使用して、置換するオブジェクト (関数またはメソッド) をオブジェクトに認識させることができますが、それらは別の目的 (モックで許可する呼び出しを制限する) を提供し、後で影響しません。 -事実確認。spec
python - Python パッチ モックが呼び出されたように見えますが、アサートは失敗します
私はPython 2.6.6を使用しています
私がやろうとしているのは、オブジェクトの作成をモックに置き換えて、正しい呼び出しが行われるようにすることです。率直であるべきです。
私のモジュール:
私のテスト:
出力は次のとおりです。
それでもテストは失敗します:
呼び出しが行われたことをモックがどのように報告できるかはわかりませんが、それらが呼び出されたと断言することはできません。私は何が欠けていますか?
編集:すべてのメトリックのレポートを追加した後、python モックについて誤解している基本的なものがあるようです。foo() が呼び出しリストにある場合、呼び出しカウントが 1 しかないのはなぜですか? また、foo.called が「False」を報告するのはなぜですか?
python-3.x - Python asyncio: __aiter__() メソッドをモックする方法は?
を使用して WebSocket でメッセージをリッスンするコードがありますaiohttp
。
次のようになります。
(元のコード)ws
のインスタンスはどこにありますかaiohttp.web.WebSocketResponse()
私のテストでは、モックWebSocketResponse()
とその__aiter__
メソッド:
テストを実行すると、次のようなエラー メッセージが表示されて失敗します。
「async for」には
__aiter__
メソッドを持つオブジェクトが必要です。MagicMock を取得しました
__aiter__()
そのため、嘲笑されたことがないかのように動作します。この場合、どのように正しいモッキングを達成することになっていますか?
アップデート:
今のところ、コードをテスト可能にするための回避策を見つけましたが、元の質問で説明されている問題に対処する方法を誰かが教えてくれれば幸いです。
python - プロダクションクラスのコンストラクターが余分な引数を取ると unittest.mock が失敗するのはなぜですか?
私が使用しているライブラリのバグであると思われる問題に遭遇しました。ただし、私は python、unittest、および unittest.mock ライブラリにかなり慣れていないため、これは私の理解に穴があるだけかもしれません。
エラーが発生した実稼働コードにテストを追加しているときに、問題を再現する最小限のサンプルを作成しました。
テストの実行方法と出力は次のとおりです。
私はpython 2.7.11を使用しており、モックバージョン2.0.0がpip経由でインストールされています。
私が間違っていることについて何か提案はありますか? それとも、これはライブラリのバグのように見えますか?
python - パラメータリストの1つでモックが呼び出されているかどうかを確認することは可能ですか
いくつかの方法があるとしましょう:
そしてメソッド呼び出し元:
self.sleep
のいずれかで呼び出されることをテストしたいwait_timers
。可能なオプション:
最初は私が今使っているものです: patchrandom.choice
は常に最初の要素を返し、次に mock の を使用しますassert_has_calls
。
2番目のオプションはrandom.choice
、必要なwait_timers
ものが渡されたことを観察して確認することです。このどちらのオプションでも、2 つのオブジェクトをモックする必要がありました。したがってunittest.mock
、モックの数を減らすために、いくつかのパラメーターの1つが関数に渡されているかどうかを確認できるかどうかをさまよっています。