如何在参数化夹具内修补功能?

How to patch function inside a parametrized fixture?

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

使用下面的代码,monkeypatch 总是调用从 mode1

修补的函数

如果我切换参数顺序 mode2mode1 它将始终调用从 mode2.

修补的函数

但是我想使用请求参数的函数pacthed。

我使用调试器检查了两个条件检查模式:mode1mode2 工作并按预期设置正确的功能。但它始终保持第一个函数的修补。

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