#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)
и это пройдет.