Как пропатчить функцию внутри параметризованного прибора? - PullRequest
0 голосов
/ 25 сентября 2019

Я хотел бы исправить функцию в зависимости от среды, учитывая, что у нас есть окружение 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

1 Ответ

1 голос
/ 25 сентября 2019

Попробуйте:

@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 - аргументы, которые функция, которую вы пытаетесь исправить, примет

...