簡體   English   中英

unittest.Mock - 結合return_value和side_effect

[英]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_valueside_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM