У меня есть функция, например:
def my_function1(my_obj, my_arg):
# do something
return
В моем unittest я хочу проверить, что вторая функция вызывает эту функцию с указанными аргументами:
def my_function2():
obj1 = SomeClassObject()
for arg in ["a", "b", "c"]:
my_function1(obj1, arg)
Для тест, я издевался над объектом, SomeClassObject
. И я также издеваюсь my_function1
, чтобы я мог контролировать, как это называется. Итак, мой юнит-тест выглядит следующим образом:
import unittest
from unittest.mock import patch, call
class MyTest(unittest.TestCase):
@patch("__main__.SomeClassObject", autospec=True)
@patch("__main__.my_function1")
def test_my_function2_calls_my_function1(self, mock_function1, mock_class_object):
my_function2()
calls = [call(mock_class_object, "a"),
call(mock_class_object, "b"),
call(mock_class_object, "c")]
mock_function1.assert_has_calls(calls)
Но это выдает следующую ошибку три раза:
AssertionError: (TypeError ("отсутствует обязательный аргумент: 'my_arg'")
Я прошел через интерактивный отладчик и обнаружил, что mock_function1._mock_call_args_list
равен
[call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'a'),
call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'b'),
call(<MagicMock name='SomeClassObject' id='140060802853296'>, 'c')]
Это идентично тому, что я получаю при печати call(mock_class_object, "a")
et c. Идентификатор точно такой же. Так выглядит, когда я запускаю .assert_has_calls
MagicMock
объект портит все.
Кто-нибудь знает, как я могу сделать это правильно?