gpt4 book ai didi

python - unittest.Mock - 结合 return_value 和 side_effect

转载 作者:行者123 更新时间:2023-11-30 22:26:39 28 4
gpt4 key购买 nike

是否可以有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 并不真正支持多语句 lambda(据我所知,您能做的最好的事情就是将表达式放入一个元组中,但随后将返回整个元组) - 是否可以组合两个参数?

我想避免必须定义一个新函数并将其用作 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

对我来说,它看起来并不干净,但对每个人来说,它看起来并不干净。如果您只是想避免污染您的 namespace ,您可以这样做:

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 - unittest.Mock - 结合 return_value 和 side_effect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47176726/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com