[英]Pass parameter to side_effect function for patching in unittest.mock
[英]unittest.Mock - Combining return_value and side_effect
是否有可能讓Mock
對象在被調用時返回一個值,並在調用時執行一個語句? 例如:
> mocked_func = Mock(return_value='Returned foo',
side_effect=lambda: print('Side effect executed')
)
> print(mocked_func())
Side effect executed
None
這里的文檔看起來有點模棱兩可,但在我看來,當使用side_effect
時,則會完全忽略return_value
,只返回side_effect
函數的結果(在print()
情況下為None
)。
由於Python並不真正支持多語句lambdas(AFAIK,你可以做的最好的事情就是將表達式放在一個元組中,然后將返回整個元組) - 是否可以組合這兩個參數?
我想避免必須定義一個新函數並將其用作side_effect
,我覺得在Mock
聲明兩者都更清晰。
回答“是否有可能讓一個Mock
對象在被調用時返回一個值,並在被調用時執行一個語句?” 顯然是的,只是讓side_effect
做所有事情:
import unittest.mock as mock
def side_effect():
print('Side effect executed')
return 'Returned Foo'
mocked_func = mock.Mock(side_effect=side_effect)
print(mocked_func())
# output
Side effect executed
Returned Foo
當然你也可以用lambda做到這一點:
import unittest.mock as mock
mocked_func = mock.Mock(
side_effect=lambda: (print('Side effect executed'), 'Returned Foo')[1]
)
print(mocked_func())
# output
Side effect executed
Returned Foo
它對我來說看起來並不干凈,但對每個人來說都不是。 如果您只是想避免污染您的命名空間,您可以這樣做:
def mocked_func():
print('Side effect executed')
return 'Returned Foo'
mocked_func = mock.Mock(side_effect=mocked_func)
或者使用裝飾者:
def mock_it(f):
return mock.Mock(side_effect=f)
@mock_it
def mocked_func():
print('Side effect executed')
return 'Returned Foo'
您已經注意到,似乎無法組合return_value
和side_effect
。
需要python版本> = 3.3
0) import unittest.mock.DEFAULT
1)使side_effect
函數返回DEFAULT
def func():
print('I am func(), and side_effect() called me!!')
return DEFAULT
4)創建模擬
nice_print = 'I am a return value that side_effect() cannot override because
side_effect() returns special obj called DEFAULT'
mocked_func = mock.Mock(side_effect=func, return_value=nice_print)
3)goodluck :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.