夹具上的py.test补丁

时间:2018-04-26 16:37:39

标签: python mocking pytest

我使用以下命令来模拟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,但模拟似乎是以非装饰的方式完成的。

2 个答案:

答案 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