【问题标题】:Mock the return value of __call__模拟 __call__ 的返回值
【发布时间】:2018-04-01 02:11:32
【问题描述】:

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

这是我尝试过的:

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

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

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

【问题讨论】:

    标签: python mocking


    【解决方案1】:

    使用return_value 参数:

    mock_mock = Mock(return_value=my_mock)
    

    【讨论】:

    【解决方案2】:

    docs 开始,您的代码可以正常工作是合理的。文档在示例中使用 __str__ 方法做了几乎相同的事情,并且它有效:

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

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

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

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

    fn = Mock()
    fn.return_value = my_mock
    
    # or
    
    fn = Mock(return_value=my_mock)
    

    【讨论】:

    • 我的困惑一定是从那里来的,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2013-10-15
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多