Python pytest-mock assert_has_calls - PullRequest
       27

Python pytest-mock assert_has_calls

0 голосов
/ 21 января 2020

Я ищу отличный плагин pytest, называемый pytest-mock (https://github.com/pytest-dev/pytest-mock), и сейчас я пробую некоторые примеры с assert_has_calls. Короче говоря, я тестирую экземпляр класса B, более конкретно, как этот экземпляр взаимодействует с экземпляром класса A (в котором я издевался над методом 'time_consuming_task').

Пример работает с alt. B (см. Комментарии в коде). Я бы предпочел alt. A, и вместо этого смоделируйте метод в классе A напрямую, вместо того, чтобы издеваться над методом в экземпляре класса A, доступном через экземпляр (obj) класса B.

class A(object):
    def do_time_consuming_task(self, timeout):
        return True


class B(object):
    def __init__(self):
        self.a = A()

    def do_work(self, timeout):
        return self.a.do_time_consuming_task(timeout)


def test_calls(mocker):
    # Prepare
    obj = B()
    #mock_a = mocker.patch.object(A, 'do_time_consuming_task', autospec=True)  # Alt. A
    mock_a = mocker.patch.object(obj.a, 'do_time_consuming_task', autospec=True)  # Alt. B
    mock_a.return_value = True

    # Exercise
    obj.do_work(timeout=100)
    obj.do_work(timeout=50)

    # Assert
    mock_a.assert_has_calls([mocker.call(100), mocker.call(50)])

1 Ответ

0 голосов
/ 21 января 2020

Удалось выяснить это с помощью другого ответа, предоставленного автором pytest-mock.

Утверждение должно называться следующим образом при использовании alt. A: mock_a.assert_has_calls ([mocker.call (mocker.ANY, 100), mocker.call (mocker.ANY, 50)])

Размещение этого сообщения, чтобы помочь другим.

...