Как использовать monkeypatch в методе "setup" для модульных тестов с использованием pytest?

Я пытаюсь макетировать класс утилиты (в данном случае утилиту Python logger) в модульном тесте.

хотя я знаю, как это сделать, используя monkeypatch на уровне теста, я надеялся, что смогу просто сделать это как часть установки/глобально каким-то образом.

вот что я надеюсь сделать (но я получаю ошибки):

import logging

...

def setup(self, monkeypatch):

    class fake_logger(level):
        def __init__(self, val):
            pass

        def setLevel(self, level):
            # Do something

    def mock_logger(level):
        return fake_logger(level)
    monkeypatch.setattr(logging, 'getLogger', mock_logger)

Как правильно это сделать?

EDIT: пример ошибки

name = 'setup'

def call_optional(obj, name):
    method = getattr(obj, name, None)
    isfixture = hasattr(method, "_pytestfixturefunction")
    if method is not None and not isfixture and py.builtin.callable(method):
        # If there's any problems allow the exception to raise rather than
        # silently ignoring them
>           method()
E           TypeError: setup() missing 1 required positional argument: 'monkeypatch'

1 ответов


monkeypatch работает как нормальное приспособление pytest. Если вы хотите использовать его, то вам нужно сделать ваш метод как приспособление также.

import logging

import pytest


@pytest.fixture
def setup(monkeypatch):

    class fake_logger(object):
        def __init__(self, val):
            pass

        def setLevel(self, level):
            # Do something
            pass

    def mock_logger(level):
        return fake_logger(level)
    monkeypatch.setattr(logging, 'getLogger', mock_logger)

def test_fake_logger(setup):
    # test steps

и если вы проверите типа logging.getLogger('any level') в тесте, это будет fake_logger вы определили.