我使用以下命令来模拟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 mocker in pytest fixture,但模拟似乎是以非装饰的方式完成的。
答案 0 :(得分:7)
我说通过装饰器修补不是这里的最佳方法。我使用了上下文管理器:
import pytest
from unittest.mock import patch
@pytest.fixture(autouse=True)
def no_delay():
with patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10):
yield
这样,在测试拆卸时可以完全恢复修补。
答案 1 :(得分:2)
pytest通过monkeypatch fixture提供内置补丁支持。因此,要修复文件中所有测试的常量,您可以创建以下autouse fixture:
@pytest.fixture(autouse=True)
def no_delay(monkeypatch):
monkeypatch.setattr(ConstantsModule.ConstantsClass, 'DELAY_TIME', 10)
如果您不想在测试中导入ConstantsModule
,可以使用字符串,请参阅full API reference。