原文:
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()
side_effect
可以在mock对象的构造函数中创建。这里的例子展示了一个在mock对象构造函数中建立的side_effect, 这个side_effect是一个可调用对象,用于接收一个数值然后返回其自身加1的新数值。
>>> side_effect = lambda value: value + 1
>>> mock = Mock(side_effect=side_effect)
>>> mock(3)
>>> mock(-8)
设置 side_effect
为 None
以取消之前mock对象设置的side_effect:
>>> m = Mock(side_effect=KeyError, return_value=3)
Traceback (most recent call last):
KeyError
>>> m.side_effect = None