#python #pytest #monkeypatching
Вопрос:
У меня есть такой класс, как следующий
class MyMixin:
def base_dir(self):
return "/mydir"
def compute(self, origin, destination):
pass # execute some computation, not relevant
В целях тестирования мне нужно изменить base_dir
. Я использовал monkeypatch
:
import MyMixin
@pytest.fixture
def global_computation(monkeypatch, temp_dir):
with monkeypatch.context() as mp:
mp.setattr(MyMixin, "base_dir", temp_dir)
yield mp
Это хорошо работает, и я хотел бы поиздеваться над compute
функцией с помощью другой функции, которая в основном расширяет оригинал несколькими дополнительными строками кода.
В идеале это было бы что-то вроде этого
def enhance_compute()
result = compute()
extra_step()
return result
mp.setattr(MyMixin, "compute", enhance_compute)
Однако я получаю ошибку атрибута и не могу понять, как ее исправить.
Продвигаясь по шагам, я попытался:
- Повторно назначьте ту же функцию (работает нормально)
mp.setattr(MyMixin, "compute", MyMixin.compute)
- Создайте другую функцию и назначьте ее вместо нее (вызывает ошибку):
def compute(origin, destination): return MyMixin.compute(origin, destination) mp.setattr(MyMixin, "compute", compute)
Ошибка заключается в следующем
<Ошибка конструктора результата(«<функция _manip_config в 0x7ff7c0cac550> вызвала ошибку: compute() получил несколько значений для аргумента»назначение»»)<функция _manip_config в 0x7ff7c0cac550>>.код выхода
Я путаюсь в аргументах, но я не уверен, как я должен их правильно передавать.
Комментарии:
1. На этом этапе, что еще осталось на самом деле проверить?
2. @jonrsharpe Фактическая функция получает эксклюзивную блокировку файла и что-то записывает. Мне нужно протестировать несколько вызовов одновременно, но из-за блокировки они не работают. Добавление
time.sleep(1)
туда сделало бы его детерминированным и простым для тестирования.