首页 > 解决方案 > 如何修补参数化夹具内的功能?

问题描述

我想根据环境修补功能,因此考虑到我们有环境mode1mode2.

使用monkeypatch调用下面的代码总是修补的函数mode1

如果我切换参数顺序 mode2mode1它将始终调用从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

标签: pythonpython-3.6pytestfixturesmonkeypatching

解决方案


尝试这个:

@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 是您尝试修补的函数将采用的参数


推荐阅读