web-dev-qa-db-fra.com

patch py.test sur le luminaire

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.

7
sg_man

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.

13
hoefling

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 .

3
flub