web-dev-qa-db-ja.com

フィクスチャのpy.testパッチ

次のコードを使用して、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フィクスチャのモッカー ですが、モックはデコレータ以外の方法で行われているようです。

7
sg_man

ここでは、デコレータを介したパッチ適用は最適な方法ではないと思います。コンテキストマネージャーを使用します。

import pytest
from unittest.mock import patch


@pytest.fixture(autouse=True)
def no_delay():
    with patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10):
        yield

このように、パッチはテストティアダウン時に完全に元に戻ります。

13
hoefling

pytestは monkeypatchフィクスチャ を介して組み込みパッチサポートを提供します。したがって、ファイル内のすべてのテストの定数にパッチを適用するには、次の自動使用フィクスチャを作成できます。

@pytest.fixture(autouse=True)
def no_delay(monkeypatch):
    monkeypatch.setattr(ConstantsModule.ConstantsClass, 'DELAY_TIME', 10)

テストでConstantsModuleをインポートしたくない場合は、文字列を使用できます。 完全なAPIリファレンス を参照してください。

3
flub