当使用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)

09-05 20:24
查看更多