模拟__call__的返回值

时间:2018-04-01 02:11:32

标签: python mocking

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

以下是我尝试的内容:

my_mock = Mock()
fn = Mock()
fn.__call__ = Mock()
fn.__call__.return_value = my_mock

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

知道我做错了什么吗?还有,有一个更简洁的方法来做到这一点?我希望能够写出fn = MockFunction(my_mock)之类的东西。

2 个答案:

答案 0 :(得分:1)

使用return_value参数:

mock_mock = Mock(return_value=my_mock)

答案 1 :(得分:1)

docs开始,期望您的代码能够正常工作是合理的。文档与示例中的__str__方法几乎完全相同,并且有效:

>>> mock = Mock()
>>> mock.__str__ = Mock()
>>> mock.__str__.return_value = 'fooble'
>>> str(mock)
'fooble'

但是,这仅适用于大多数魔术方法,并且其工作的确切列表未记录:

  

因为魔术方法的查找方式与普通方法[2]不同,所以这种支持已经特别实现。这意味着只支持特定的魔术方法。受支持的列表包括几乎所有这些。如果您有任何遗漏,请告诉我们。

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

fn = Mock()
fn.return_value = my_mock

# or

fn = Mock(return_value=my_mock)