10

我无法理解某些测试代码中发生了什么。它看起来像这样:

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是一个在调用 mock 时调用的函数
  • 但如果side_effect是可迭代的,那么“对模拟的每次调用都将返回可迭代的下一个值”(感谢pytest docs
  • 文档还说,如果传递给的函数side_effect 返回DEFAULT,那么模拟将返回它的正常值 return_value

但这是我不明白的:

  • 当我同时提供副作用列表返回值时会发生什么?
  • 我应该期望在每次调用时看到MyClass.method_to_call_thrice什么?
4

1 回答 1

20

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'
于 2019-05-17T17:49:52.547 回答