Учитывая следующий код и тесты:
# some module
from other.module import a_func # returns False by default
def do_stuff():
return "banana" if a_func() else "pear"
#############################
# tests in a different module
@pytest.fixture
def my_fixture():
with mock.patch("other.module.a_func", lambda: True):
yield
class TestMyStuff:
def test_something(self):
assert do_stuff() == "pear"
def test_something_else(self, my_fixture):
assert do_stuff() == "banana"
Последний тест завершается ошибкой, если я запускаю все свои тесты одновременно, но завершается успешно, если я запускаю только его.
Я знаю, что это может быть связано с тем, что к моменту запуска test_something_else
other.module.a_func
уже импортирован и загружен, поэтому патч не вступает в силу.
Как мне заставить это работать или как мне реструктурировать мой код, чтобы я мог имитировать результат a_func
для тестирования различных результатов do_stuff
?
Ты должен сделать
mock.patch("some.module.a_func")
вместо того
mock.patch("other.module.a_func")
from other.module import a_func
означает, что a_func
становится частью some.module
, поэтому исправление происхождения определения функции не имеет никакого эффекта — вместо этого исправление должно выполняться там, где функция используется. Прочтите Где патчить для получения дополнительной информации.
Я пытаюсь создать приспособление в conftest, которое будет доступно для нескольких модулей. Есть ли способ пропатчить все модули, не прописывая каждый вручную?
Я, должно быть, читал это и объяснение pytest тысячу раз, не говоря уже о всех вопросах, похожих на мои, но каким-то образом ваш короткий пример наконец заставил его щелкнуть. Спасибо. :)