Добавьте дополнительные шаги к функции для целей тестирования с помощью monkeypatch

#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) туда сделало бы его детерминированным и простым для тестирования.