テストしているアプリケーションの場合、予期せず電子メールを送信しようとした場合にテストに失敗するようにautouse=True
をmonkeypatchするsmtplib.SMTP.connect
フィクスチャを作成したいと思います。
ただし、テストでメールを送信することが予想される場合は、代わりにそれらのメールをログに記録する別のフィクスチャを使用します(おそらく、pytest-localserver
のsmtpserver
フィクスチャを使用し、connect
そのフィクスチャによって返されるホスト/ポートを使用するメソッド)
もちろん、これは、自動使用フィクスチャが他のフィクスチャ(funcargとしてロードされる)の前に実行された場合にのみ機能します。フィクスチャが実行される特定の順序はありますか、および/または実行順序を保証する方法はありますか?
フィクスチャが実行される順序を制御する最も簡単な方法は、後のフィクスチャで前のフィクスチャを要求することです。したがって、b
がa
の前に実行されることを確認するには:
@pytest.fixture(autouse=True, scope="function")
def b():
pass
@pytest.fixture(scope="function")
def a(b):
pass
私はちょうど2つのfunction
スコープの自動使用フィクスチャでこの問題を抱えていました。フィクスチャb
をフィクスチャa
の前に実行したかったのですが、毎回a
が最初に実行されました。アルファベット順かもしれないと思ったので、a
の名前をc
に変更すると、b
が最初に実行されます。 Pytestはこれを文書化していないようです。幸運な推測でした。 :-)
それは自動使用器具用です。より広いスコープ(例:module
、session
)を考慮すると、pytestがそれを必要とするテストに遭遇すると、フィクスチャが実行されます。したがって、2つのテストがあり、最初のテストでsession
という名前のフィクスチャではなくsb
という名前のsa
スコープのフィクスチャを使用する場合、sb
は次のようになります。最初に実行されます。次のテストが実行されると、sa
が必要であると想定して、sa
が開始されます。
IIRCでは、スコープの高いフィクスチャを最初に実行する必要があります。したがって、monkeypatch smtplib.SMTP.connect
へのセッションスコープの自動使用フィクスチャを作成した場合、1つのテストでこのモンキーパッチを元に戻し、後で復元する関数スコープのフィクスチャを作成できます。これを行う最も簡単な方法は、disallow_smtp
フィクスチャとpytest-localserver
のsmtpserver
フィクスチャの両方に依存して処理する独自のsmtpserver
フィクスチャを作成することだと思います。これら2つを連携させるために必要なすべてのセットアップと分解。
これは漠然とpytest-Django
がデータベースアクセスを処理する方法です。そこでコードを試してみることができますが、単純な例とはほど遠いものであり、独自の奇妙なことがたくさんあります。