python - 如何修补参数化夹具内的功能?
问题描述
我想根据环境修补功能,因此考虑到我们有环境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 是您尝试修补的函数将采用的参数
推荐阅读
- mysql - 在 SQL 中选择发送者和接收者之间的最后一条消息
- javascript - 如何在自定义钩子中测试 useEffect?
- python - 从excel列中选择行并根据Python中的另一列生成新列
- sql - 具有动态 SQL 语句的 Redshift UDF 函数
- visual-studio-code - 在 VScode 中禁用快捷菜单栏
- apache-zookeeper - 如何将 Clickhouse 的 Zookeeper 迁移到新实例?
- javascript - javascript计时器结束后显示页面的隐藏部分
- java - 尽管给出了 ID,但 Selenium 没有单击按钮(Java)
- kubernetes - 如何在 kubernetes 的单个 filebeat DaemonSet 中声明多个 output.logstash?
- duplicates - 通过 SQL 从 BizTalk 中的上下文中获取 ReceivedFileName