Как проверить, что функция была вызвана с помощью специального аргумента python

#python #unit-testing #mocking #pytest

#питон #модульное тестирование #осмеяние #пытест

Вопрос:

Я пишу модульный тест и пытаюсь проверить, что функция была вызвана с правильными аргументами. Мне сказали, что я могу сделать это с помощью насмешек. Это мой код

 import pytest from mock import patch import attr  def adjust(x):  if x is None:  return 0  return x  @attr.s class Pater():  only_argument = attr.ib(type=int,converter = adjust)  def foo(pass_only):  yield Pater(pass_only)  @patch("this_file.Pater") def test_foo(mock_Pater):  foo(None)  mock_Pater.assert_called_with(None)  

Но я получаю следующую ошибку

 E AssertionError: expected call not found. E Expected: Pater(None) E Actual: not called.  

Не могли бы вы посоветовать мне, как это сделать правильно?

Ответ №1:

Ваш тест действительно не вызывает/не создает экземпляр Pater , потому foo() что это Pater генератор, и вы еще не извлекли из него никаких элементов. Другими словами, код внутри yield не выполняется до тех пор, пока вы не повторите возвращаемое значение foo() .

Измените свой тест на:

 @patch("this_file.Pater") def test_foo(mock_Pater):  next(foo(None))  mock_Pater.assert_called_with(None)  

и это пройдет.