問題タブ [python-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 - Python単体テストでクラス属性をモックするより良い方法
クラス属性とそれに依存するいくつかの子クラスを定義する基本クラスがあります。
このクラスをさまざまな割り当て(空の辞書、単一項目など)で単体テストしたいのですが、これはもちろん非常に単純化されており、クラスやテストをリファクタリングする必要はありません。
私が思いついた(pytest)テストは、最終的に、その作業は
これはかなり複雑でハッキリしているように感じます-なぜそれが機能するのか完全には理解していません(ただし、記述子には精通しています)。モックは自動的にクラス属性を記述子に変換しますか?
より論理的に感じるソリューションは機能しません。
あるいは単に
私が試した他のバリアントも機能しません (割り当てはテストで変更されません)。
クラス属性をモックする適切な方法は何ですか? 上記の方法よりも優れた/より理解しやすい方法はありますか?
python - 複雑な多次元辞書入力に python モックを使用することは可能ですか?
モックライブラリについて読み始めましたが、sync 関数をテストするための入力値として使用する方法がよくわかりません。
私の同期関数は、外部ソースから多次元辞書を取得し、それを解析してさまざまな Django データベース レコードに変換します
私は勇敢に試しました:
しかし、モックが返す値の型が原因で、率直に失敗することが確実に予想されます。
したがって、いくつかの戻り値を手動で設定する方がよいと思います。次の実験を試しました。
return_value も試しました
しかし、同期関数内のコードは、辞書からの整数値を期待しています...
python - python モック パッチ トップ レベル パッケージ
Python でモックを使用すると、トップ レベルのパッケージ (argparse など) に完全にパッチを適用することはできません。おそらく、パッチへの参照がないためです。1 つの解決策は、個々の呼び出しをすべてパッケージにパッチすることです (argparse.ArgumentParser など)。理論的には、パッケージへの呼び出しが対応するパッチなしで追加された場合、単体テスト中に誤ってインポートが呼び出されることになります。
回避策はそれほど不便ではありませんが、argparse などのパッケージに完全にパッチを適用するのが理想的です。mock_openopen()
は、 を使用して組み込みにパッチを当てるために、いくつかの悪ふざけを採用しているよう__main__.open
です。それはどのように機能し、トップレベルのパッケージにパッチを当てるために同様の悪ふざけを使用できますか?
python - Django単体テストでdatetimeにパッチを当てる最良の方法
私は自作のdatetime.datetime
モックを使用して、コード全体で datetime を修正していますが (一番下を参照)、他の人はそれがどのように機能するかを理解するのに問題があり、予期しない問題に遭遇しているようです。次のテストを検討しました。
Django DatetimeField がどのように日付を SQL にシリアル化するかを見ると、次のようになります。
u.save()
この部分は、テストで呼び出すと実行されます。Django コードのこの時点でvalue
( u.last_login
) の値が型datetime.datetime
になっているのは、パッチを適用していないバージョンの datetime を使用してテストで値を割り当てたためです (インポートがモジュール レベルであり、パッチがメソッド レベルであるため)。
現在、Django コードにdatetime.datetime
はパッチが適用されているため、次のようになります。
次と同等です。
これは偽ですが、次のとおりです。
は True であるため、datetime.datetime
オブジェクトは に変換され
、SQL からdatetime.date
取得すると、値は実際には ではなくu2.last_login
datetime(2014, 04, 01, 0, 0, 0)
datetime(2014, 04, 01, 14, 0, 0)
したがって、テストは失敗します。
これを回避するには、次のように置き換えます。
と:
しかし、これは間違いを起こしやすく、テストを使用したり書いたりする人々を混乱させる傾向があります。
now
特に実際の値が必要な場合は、実行するdatetime_to_fakedatetime(datetime.datetime.now())
か呼び出す必要がありますFakeDatetime.now()
が、前のテストでFakeDatetime.now_value
.
これをより直感的にする方法を探していますが、同時にdatetime.datetime
特定のサブモジュールのオブジェクトにパッチを適用する必要がないようにし (サブモジュールが多数存在する可能性があるため)、コード全体にパッチを適用するだけです。
自作モックのコード:
ありがとう!
python - Pythonモックとマジックモックの違いは何ですか?
私が見ることができたので、pythonモックとマジックモックの違いは何ですか
いつモック obj を使用するか & いつ MagicMock obj を使用するか??
python - Pythonモックサードパーティモジュール
ツイートを処理するいくつかのクラスをテストしようとしています。私は、sixohsix twitter を使用して Twitter API を処理しています。Twitter クラスのファサードとして機能するクラスがあり、実際の sixohsix クラスをモックして、新しいツイートをランダムに生成するか、データベースから取得することで、ツイートの到着をシミュレートすることを考えました。
私のファサードは次のようになります。
ユニットテストで、つぶやきを処理するモジュールをテストしたい場合、TwitterStream クラスをどのようにモックしますか? 私はモックを使ってみました:
これは機能していません。Twitter API がまだ呼び出されています。モッククラスにコードを追加しなかったので、エラーか何かが発生したと予想していましたが、代わりに6つのtwitterクラスが呼び出されました。
python - モック: すべての通話を追跡します。シェルとプログラムの不一致
シェルで実行するかプログラムで実行するかによって、mock.mock_calls の内容が異なるのはなぜですか? のアサーションはmock.mock_calls == expected
プログラムでは失敗しますが、シェルではパスします。このコードは、複数の通話を追跡するためのドキュメントに基づいています。(26.5.1.5. すべての通話の追跡)
これまでのところ、すべて正確に予想どおりです。しかし、プログラムで何が起こっているかを見てください。呼び出されたすべてのメソッドのメソッドmock.mock_calls
への追加の呼び出しが記録されます。__str__
mock.method_calls は影響を受けません。
出力:
Windows 7 コンピューターで Python 3.4 を実行しています。