Как использовать 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
вы определили.