Утверждать ложные аргументы, если аргументы включают другую ложную - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть функция, например:

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 объект портит все.

Кто-нибудь знает, как я могу сделать это правильно?

1 Ответ

0 голосов
/ 24 апреля 2020

Я не уверен, почему именно вы получаете это сообщение об ошибке, но вы проверяете класс вместо объекта в качестве аргумента. Вот что должно работать:

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):
        my_function2()
        mock_class_object = mock_class.return_value
        calls = [call(mock_class_object, "a"),
                 call(mock_class_object, "b"),
                 call(mock_class_object, "c")]
        mock_function1.assert_has_calls(calls)
...