Pytest макет объекта, возвращаемого через yield и проверяет, вызывается ли метод этого объекта
У меня есть кусок кода, который нужно проверить с помощью pytest
def my_function(value):
with some_generator() as gen:
gen.some_method(value)
Мне нужно проверить, был ли вызван some_method или нет. я использовал pytest-mock
издеваться над методом some_generator, чтобы вернуть MagicMock
и использовал этот объект, чтобы проверить, вызван ли метод. Но это возвращает ложь. Кроме того, возвращаемое мной значение не отражается на some_method
def test_myfunction(mocker):
generator = mocker.patch('some_generator')
mocked_obj = mock.MagicMock()
generator.return_value = mocked_obj
my_function(1)
assert mocked_obj.some_method.called
Тест всегда терпит неудачу, хотя gen.some_method(value)
называется.
1 ответ
Решение
Я думаю, что у вас есть две проблемы:
- Ты не говоришь
mocker
гдеsome_generator
является. Я думаю, что вам нужно включить имя модуля. - Вы издеваетесь над возвращаемым значением генератора, но не над
__enter__()
вызовите, что делает с заявлением. Вам не нужен отдельный объект для этого,mocker
уже создает фиктивный объект дляreturn_value
и любые вложенные атрибуты.
Вот исправленная версия вашего теста:
from scratch import my_function
def test_myfunction(mocker):
generator = mocker.patch('scratch.some_generator')
my_function(1)
assert generator.return_value.__enter__.return_value.some_method.called
Просто для полноты, вот работоспособная версия my_function
что я использовал:
# scratch.py
def some_generator():
pass
def my_function(value):
with some_generator() as gen:
gen.some_method(value)