J'utilise ce qui suit pour simuler des valeurs constantes pour un test avec py.test:
@patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10)
def test_PowerUp():
...
thing = Thing.Thing()
assert thing.a == 1
Cela se moque de DELAY_TIME tel qu'utilisé à la fois dans le test et dans Thing, ce à quoi je m'attendais.
Je voulais le faire pour tous les tests de ce fichier, j'ai donc essayé
@patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10)
@pytest.fixture(autouse=True)
def NoDelay():
pass
Mais cela ne semble pas avoir le même effet.
Voici une question similaire: pytest-mock mocker in pytest fixture , mais la maquette semble faite de manière non décorative là-bas.
Je dirais que l'application de correctifs via le décorateur n'est pas l'approche optimale ici. J'utiliserais le gestionnaire de contexte:
import pytest
from unittest.mock import patch
@pytest.fixture(autouse=True)
def no_delay():
with patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10):
yield
De cette façon, le patch est proprement inversé lors du démontage du test.
pytest fournit une prise en charge intégrée des correctifs via le appareil monkeypatch . Donc, pour patcher la constante pour tous les tests dans le fichier, vous pouvez créer le montage automatique suivant:
@pytest.fixture(autouse=True)
def no_delay(monkeypatch):
monkeypatch.setattr(ConstantsModule.ConstantsClass, 'DELAY_TIME', 10)
Si vous ne voulez pas que le ConstantsModule
soit importé dans vos tests, vous pouvez utiliser une chaîne, voir référence API complète .