【问题标题】:How to setup return_value for a function call with specific signature?如何为具有特定签名的函数调用设置 return_value?
【发布时间】:2014-04-15 23:18:08
【问题描述】:

我有一些这样的代码

class MyClass:
    def my_function(self):
        ....
        return lst

我想测试一些其他调用my_function 的函数。我不知道如何为具有特定签名的函数调用设置return_value。有没有办法做到这一点?这可以通过 .Net 中的 Moq 轻松完成...

这是我尝试过的,但它不起作用。

with patch("MyClass.my_function") as my_mock:
    my_mock(1, 2).return_value = [
        {
            "id" : "A"
        }
    ]

    #call the function...
    #assert...

【问题讨论】:

    标签: python python-3.x mocking patch


    【解决方案1】:
    my_mock(1, 2).return_value = value
    

    您对该行所做的实际上是为另一个通过调用 my_mock 返回的模拟对象设置 return_value。如果您执行m()(),而不是您可能预期的m(1, 2),将返回您在此处分配的值。

    return_value 不依赖于调用签名,应该这样使用:

    >>> my_mock.return_value = 'foobar'
    >>> my_mock()
    'foobar'
    >>> my_mock(1, 2)
    'foobar'
    

    如果你希望返回值依赖于调用参数,你应该使用side_effect:

    >>> def mock_func(*args):
    ...     if args == (1, 2):
    ...         return 'foo'
    ...     else:
    ...         return 'bar'
    ...
    >>> my_mock.side_effect = mock_func
    >>> my_mock(1, 2)
    'foo'
    >>> my_mock()
    'bar'
    

    顺便说一句,我更喜欢使用patch.object 修补方法。我不认为patch("MyClass.my_function") 会起作用,因为patch() 要求目标以包/模块名称开头。

    【讨论】:

    • patch(...) 有效,它针对加载模块的功能而不是特定对象。但我会尝试side_effect。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多