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 ответ

Решение

Я думаю, что у вас есть две проблемы:

  1. Ты не говоришь mocker где some_generator является. Я думаю, что вам нужно включить имя модуля.
  2. Вы издеваетесь над возвращаемым значением генератора, но не над __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)
Другие вопросы по тегам