原文: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