模拟 __call__ 的返回值

Pig*_*Pig 3 python mocking

我正在用 Python 编写单元测试,我想创建一个模拟函数,该函数在调用时返回另一个模拟(由我指定)。

这是我尝试过的:

my_mock = Mock()
fn = Mock()
fn.__call__ = Mock()
fn.__call__.return_value = my_mock
Run Code Online (Sandbox Code Playgroud)

但是当我调用 时fn(),它返回一个不同的模拟,可能是某些描述的默认值。

知道我做错了什么吗?另外,有没有更简洁的方法来做到这一点?我很想能够写出类似的东西fn = MockFunction(my_mock)

wim*_*wim 5

使用return_value参数:

mock_mock = Mock(return_value=my_mock)
Run Code Online (Sandbox Code Playgroud)


use*_*ica 5

文档来看,可以合理地期望您的代码能够正常工作。__str__文档使用示例中的方法执行几乎相同的操作,并且它有效:

>>> mock = Mock()
>>> mock.__str__ = Mock()
>>> mock.__str__.return_value = 'fooble'
>>> str(mock)
'fooble'
Run Code Online (Sandbox Code Playgroud)

然而,这仅适用于大多数魔术方法,并且其适用的确切列表没有记录:

由于魔法方法的查找方式与普通方法不同[2],因此专门实现了此支持。这意味着仅支持特定的魔术方法。支持的列表几乎包括所有这些。如果您需要任何缺失,请告诉我们。

__call__恰好是列表中没有的魔法方法之一。相反,您需要使用return_value模拟本身的属性,或者return_value向构造函数提供参数。

fn = Mock()
fn.return_value = my_mock

# or

fn = Mock(return_value=my_mock)
Run Code Online (Sandbox Code Playgroud)