当使用mock
库编写python测试时,我经常会得到这样的“方法调用的参数是什么”,
from __future__ import print_function
import mock
m = mock.MagicMock(side_effect=lambda x: x * x)
m(4)
print("m called with: ", m.call_args_list)
(这将打印
m called with: [call(4)]
)。问题:有没有办法得到返回值(在这种情况下,16
)?详细信息:在我的特定场景中,我想使用side_effect返回一个子模拟对象:内省该对象以查看对其调用的内容很重要。例如,“真实代码”(非测试代码)可能会写,
myobj = m(4)
myobj.foo()
使用
side_effect
似乎是返回新的子模拟对象的一种方便的方法,但也可以保留call_args_list
。但是,似乎MagicMock
不存储side_effect
函数的返回值…我错了吗? 最佳答案
如果你问我,这不是嘲笑的目的。如果你想断言一个返回值,你应该直接调用函数。如果需要跳过圈来注册函数返回的内容,那么您的设计很可能有缺陷。
例如,如果您有一个内部函数,则不应测试该内部函数。如果要测试内部函数,请将其公开访问。
所以不要这样:
def spam(input):
def eggs(nested):
return nested*2
input = eggs(nested)
return eggs(input)
执行以下操作:
def eggs(nested):
return nested*2
def spam(input):
input = eggs(nested)
return eggs(input)