繁体   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