[翻译] Python unittest side_effect

原文:https://docs.python.org/3.7/library/unittest.mock.html#unittest.mock.Mock.side_effect

side_effect:

它既可以是一个mock对象被调用时执行的可调用的函数,也可以是一个可迭代对象或者执行时抛出的一个异常(异常类或实例)。

如果side_effect实际指向一个函数,那么当此mock对象被调用时,side_effect会直接传递传入mock的参数给函数并执行之。除非该函数返回unittest.mock.DEFAULT单例对象,否则mock对象返回此函数执行后的返回值。如果该函数返回unittest.mock.DEFAULT,那么mock对象实际的返回结果将与此mock对象的unittest.mock.Mock.return_value返回值一致。

如果side_effect实际指向一个可迭代对象,那么每次调用mock对象均会生成并返回此可迭代对象中单次迭代后的值。可迭代对象中既可以是需要抛出异常实例,或者是需要让调用mock对象时返回的值(若单次迭代返回值是unittest.mock.DEFAULT,实际返回值与当side_effect指向一个函数时的情况一致)。

例子: 此mock对象会抛出一个异常 (一般用于测试某个API的异常处理流程):

>>> mock = Mock()
>>> mock.side_effect = Exception('Boom!')
>>> mock()
Traceback (most recent call last):
  ...
Exception: Boom!

使用 side_effect 返回一个序列的每次迭代后的值:

>>> mock = Mock()
>>> mock.side_effect = [3, 2, 1]
>>> mock(), mock(), mock()
(3, 2, 1)

使用一个可调用对象(函数)作为side_effect的实际指向的对象:

>>> mock = Mock(return_value=3)
>>> def side_effect(*args, **kwargs):
...     return DEFAULT
...
>>> mock.side_effect = side_effect
>>> mock()
3

side_effect 可以在mock对象的构造函数中创建。这里的例子展示了一个在mock对象构造函数中建立的side_effect, 这个side_effect是一个可调用对象,用于接收一个数值然后返回其自身加1的新数值。

>>> side_effect = lambda value: value + 1
>>> mock = Mock(side_effect=side_effect)
>>> mock(3)
4
>>> mock(-8)
-7

设置 side_effect 为 None 以取消之前mock对象设置的side_effect:

>>> m = Mock(side_effect=KeyError, return_value=3)
>>> m()
Traceback (most recent call last):
 ...
KeyError
>>> m.side_effect = None
>>> m()
3
posted @ 2020-03-31 01:06  r0xFED  阅读(1928)  评论(0编辑  收藏  举报