Что происходит, когда макет Python имеет и возвращаемое значение, и список побочных эффектов? - PullRequest
0 голосов
/ 17 мая 2019

У меня проблемы с пониманием того, что происходит в каком-то тестовом коде.Это выглядит так:

import pytest
from unittest.mock import MagicMock
from my_module import MyClass

confusing_mock = MagicMock(
    return_value=b"",
    side_effect=[
        ConnectionError(),
        b"another_return_value?",
        b"another_another_return_value?"
    ])

mocked_class = MyClass()
monkeypatch.setattr(mocked_class, "method_to_call_thrice", confusing_mock)

Я знаю, что:

  • side_effect - это функция, которая вызывается всякий раз, когда вызывается макет
  • , но если side_effect является итеративным, тогда «каждый вызов mock будет возвращать следующее значение из итерируемого» (спасибо pytest docs )
  • документы также говорят, что если функция передана side_effect возвращает DEFAULT, тогда макет вернет свое нормальное значение из return_value

Но вот что я не получаю:

  • Что происходит, когда япредоставить оба a список побочных эффектов и возвращаемое значение ?
  • Что я должен ожидать при каждом вызове MyClass.method_to_call_thrice?

1 Ответ

2 голосов
/ 17 мая 2019

side_effect используется. Значение списка может содержать mock.DEFAULT, а функция может возвращать mock.DEFAULT, чтобы указать, что следует использовать значение атрибута return_value.

>>> import unittest.mock
>>> m = unittest.mock.Mock(return_value="foo",
...                        side_effect=[1, 2, unittest.mock.DEFAULT, 4, 5])
>>> m()
1
>>> m()
2
>>> m()
'foo'
>>> m()
4
>>> m()
5
>>> unittest.mock.Mock(return_value="foo",
...                    side_effect=lambda: unittest.mock.DEFAULT)()
'foo'
...