Неожиданное поведение от unittest.mock.patch - PullRequest
0 голосов
/ 05 ноября 2018

Что не так с моим кодом ниже?

Я ожидаю, что assert call_func_once_with("b") выдаст ошибку, так как call_func был передан 'a'. Я признал, что функция действительно была вызвана один раз и с аргументом «а».

from unittest.mock import Mock, patch
def call_func(x):
    pass

@patch("__main__.call_func")
def test_call_func(call_func):
    call_func("a")
    assert call_func.called_once_with("b")
    assert call_func.called == 1
    print(call_func.call_args)

test_call_func()

Выход:

call('a')

1 Ответ

0 голосов
/ 05 ноября 2018

Вы не первый, кто замечает странные вещи с этими типами утверждений (см. Волшебная насмешка assert_called_once против assert_called_once_with странное поведение )

Для чего бы то ни было, я могу только посоветовать вам попробовать создать тестовый класс, который наследуется от unittest.TestCase, а затем использовать метод assertEqual для получения более согласованного поведения теста:

import unittest
from unittest.mock import patch, call


def call_func(x):
    pass


class MyTests(unittest.TestCase):
    @patch("__main__.call_func")
    def test_call_func(self, call_func_mock):
        call_func_mock("a")
        # assert call_func_mock.called == 1
        # assert call_func_mock.called_once_with("b")
        self.assertEqual(call_func_mock.call_count, 1)
        self.assertEqual(call_func_mock.call_args_list[0], call("b"))
        print(call_func_mock.call_args)


unittest.main()

Это дает следующие (ожидаемые) результаты:

F
======================================================================
FAIL: test_call_func (__main__.MyTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python36\lib\unittest\mock.py", line 1179, in patched
    return func(*args, **keywargs)
  File "C:/scratch.py", line 16, in test_call_func
    self.assertEquals(call_func_mock.call_args_list[0], call("b"))
AssertionError: call('a') != call('b')

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=1)

Process finished with exit code 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...