次のコードを使用して、py.testでテスト用の定数値を模擬します。
@patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10)
def test_PowerUp():
...
thing = Thing.Thing()
assert thing.a == 1
これは、テストとThingの両方で使用されているDELAY_TIMEを模倣したものです。
このファイルのすべてのテストでこれを実行したかったので、試しました
@patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10)
@pytest.fixture(autouse=True)
def NoDelay():
pass
しかし、それは同じ効果を持っているようには見えません。
同様の質問は次のとおりです: pytest-mock pytestフィクスチャのモッカー ですが、モックはデコレータ以外の方法で行われているようです。
ここでは、デコレータを介したパッチ適用は最適な方法ではないと思います。コンテキストマネージャーを使用します。
import pytest
from unittest.mock import patch
@pytest.fixture(autouse=True)
def no_delay():
with patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10):
yield
このように、パッチはテストティアダウン時に完全に元に戻ります。
pytestは monkeypatchフィクスチャ を介して組み込みパッチサポートを提供します。したがって、ファイル内のすべてのテストの定数にパッチを適用するには、次の自動使用フィクスチャを作成できます。
@pytest.fixture(autouse=True)
def no_delay(monkeypatch):
monkeypatch.setattr(ConstantsModule.ConstantsClass, 'DELAY_TIME', 10)
テストでConstantsModule
をインポートしたくない場合は、文字列を使用できます。 完全なAPIリファレンス を参照してください。