Python mock - Проверить, вызываются ли методы в mock-объекте - PullRequest
0 голосов
/ 06 августа 2020

У меня есть определенный фрагмент кода, который выглядит следующим образом:

# file1.py
from module import Object

def method():
    o = Object("param1")
    o.do_something("param2")

У меня есть модульные тесты, которые выглядят так:

@patch("file1.Object")
class TestFile(unittest.TestCase):
    def test_call(self, obj):
        ...

Я могу выполнить obj.assert_called_with() в модульном тесте чтобы убедиться, что конструктор был вызван с определенными параметрами. Можно ли проверить, что obj.do_something был вызван с определенными параметрами? Моим инстинктом нет, так как Mock полностью инкапсулирован в Object, но я надеялся, что может быть какой-то другой способ.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

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

@patch("file1.Object")
class TestFile:
    def test_call(self, obj):
        method()
        obj.assert_called_once_with("param1")
        obj.return_value.do_something.assert_called_once_with("param2")

obj.return_value - это экземпляр Object (который представляет собой объект MagickMock с Object spe c), а do_something - еще один макет в этом объект, который вызывается с заданным параметром.

Пока вы просто передаете аргументы фиктивным объектам, макет будет записывать это, и вы можете его проверить. Чего у вас нет, так это каких-либо побочных эффектов от реальных вызовов функций - поэтому, если исходный do_something вызовет другую функцию, это нельзя проверить.

EDIT : I hadn ' Прочтите второй ответ правильно - он также правильно отвечает на вопрос. Так что это скорее поправка к этому ответу ...

0 голосов
/ 06 августа 2020

Когда вы имитируете объект, он также будет издеваться над методами внутри объекта. Таким образом, вы можете увидеть, был ли вызван obj.do_something с определенными параметрами как obj.do_something.assert_called_with()

. Более подробную информацию о модульном тестировании можно найти в библиотеке python wiki https://docs.python.org/3/library/unittest.mock.html

Прекрасный пример того, что вы просите, существует в этом источнике вики:

>>> mock = Mock()
>>> mock.method(1, 2, 3, test='wow')
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_with(1, 2, 3, test='wow')

https://docs.python.org/3/library/unittest.mock.html#unittest .mock.Mock.assert_called_with

С уважением, я вижу, что вы поместили исправление на объект, попробуйте вместо этого поместить его в функцию, например:

class TestFile(unittest.TestCase):
    @patch("file1.Object")
    def test_call(self, obj):
        ...
...