如何在参数化夹具内修补功能?
How to patch function inside a parametrized fixture?
我想根据环境修补一个功能,因此考虑到我们有环境 mode1
和 mode2
。
使用下面的代码,monkeypatch 总是调用从 mode1
修补的函数
如果我切换参数顺序 mode2
和 mode1
它将始终调用从 mode2
.
修补的函数
但是我想使用请求参数的函数pacthed。
我使用调试器检查了两个条件检查模式:mode1
和 mode2
工作并按预期设置正确的功能。但它始终保持第一个函数的修补。
conftest.py
def pytest_generate_tests(metafunc):
if 'patch_fhs' in metafunc.fixturenames:
metafunc.parametrize('patch_fhs', ['mode1', 'mode2'], indirect=True, scope='session')
@pytest.fixture()
def parametrized_patch(request):
if request.param == 'mode1':
monkeypatch = MonkeyPatch()
import mymodule
def patched_func():
return 'patched_mode1'
monkeypatch.setattr(mymodule, 'my_func', patched_func)
elif if request.param == 'mode2':
monkeypatch = MonkeyPatch()
import mymodule
def patched_func():
return 'patched_mode2'
monkeypatch.setattr(mymodule, 'my_func', patched_func)
else:
raise ValueError('Unknown mode named: {name}'.format(name=request.param))
return request.param
test_parametrized_fixture.py
def test_foo(parametrized_patch):
from mymodule import my_func
print(parametrized_patch)
print(my_func)
测试输出类似于
-> test_foo
mode1
patched_mode1
-> test_foo
mode2
patched_mode1
试试这个:
@pytest.fixture(params=your_params)
def parametrized_patch(monkeypatch, request):
monkey patch.setattr(
your_module,
'your_func',
lambda x, y, z: request.param
)
x、y、z 是您尝试修补的函数将采用的参数
我想根据环境修补一个功能,因此考虑到我们有环境 mode1
和 mode2
。
使用下面的代码,monkeypatch 总是调用从 mode1
如果我切换参数顺序 mode2
和 mode1
它将始终调用从 mode2
.
但是我想使用请求参数的函数pacthed。
我使用调试器检查了两个条件检查模式:mode1
和 mode2
工作并按预期设置正确的功能。但它始终保持第一个函数的修补。
conftest.py
def pytest_generate_tests(metafunc):
if 'patch_fhs' in metafunc.fixturenames:
metafunc.parametrize('patch_fhs', ['mode1', 'mode2'], indirect=True, scope='session')
@pytest.fixture()
def parametrized_patch(request):
if request.param == 'mode1':
monkeypatch = MonkeyPatch()
import mymodule
def patched_func():
return 'patched_mode1'
monkeypatch.setattr(mymodule, 'my_func', patched_func)
elif if request.param == 'mode2':
monkeypatch = MonkeyPatch()
import mymodule
def patched_func():
return 'patched_mode2'
monkeypatch.setattr(mymodule, 'my_func', patched_func)
else:
raise ValueError('Unknown mode named: {name}'.format(name=request.param))
return request.param
test_parametrized_fixture.py
def test_foo(parametrized_patch):
from mymodule import my_func
print(parametrized_patch)
print(my_func)
测试输出类似于
-> test_foo
mode1
patched_mode1
-> test_foo
mode2
patched_mode1
试试这个:
@pytest.fixture(params=your_params)
def parametrized_patch(monkeypatch, request):
monkey patch.setattr(
your_module,
'your_func',
lambda x, y, z: request.param
)
x、y、z 是您尝试修补的函数将采用的参数