Pytest Monkeypatch Не Применяется К Импортированной Функции

0

Вопрос

У меня есть модуль, настроенный примерно следующим образом:

# foo.py
def generate_things_based_on_other_things():
  # some nasty things here

# bar.py
from foo import generate_things_based_on_other_things as generate

def coo():
  generate()

# conftest.py
import pytest

@pytest.fixture(autouse=True)
def patch_generate(monkeypatch):
  def mock_generate():
    print("hello!")

  monkeypatch.setattr("app.bar.generate", mock_generate)

# test_bar.py
from bar import coo

def test_coo():
  coo()

В соответствии с этим ответом я позаботился о том, чтобы сопоставить фактический импортированный экземпляр функции. Любой другой путь бросает "does not exist on module" ошибка. Однако, когда я запускаю тест, я сталкиваюсь с ошибкой, потому что исходная функция generate вызывается, несмотря на то, что это обезьяна. Я тоже не могу понять, почему этот патч не будет держаться так, как я ожидаю. Я бы ожидал, что этот тест напечатает "привет!".

monkeypatching pytest python
2021-11-23 15:16:56
1

Лучший ответ

0

Ваши пути, похоже, не совпадают. Вы делаете from bar import coo, но используйте setattr с app.bar. Чтобы быть уверенным, вы можете использовать другую форму setattr вместо этого, который принимает имена объекта и атрибутов отдельно, например:

import bar  # or "from app import bar", whichever is correct for you

@pytest.fixture(autouse=True)
def patch_generate(monkeypatch):
    def mock_generate():
        print("hello!")

    monkeypatch.setattr(bar, "generate", mock_generate)

Таким образом, вы можете быть достаточно уверены, что исправляете правильный объект.

2021-11-26 20:08:33

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................