如何为具有特定签名的函数调用设置return_value?

时间:2014-04-15 23:18:08

标签: python python-3.x mocking patch

我有一些像这样的代码

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...

1 个答案:

答案 0 :(得分:0)

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()要求目标以包/模块名称开头。