在不更改“被调用”计数的情况下设置模拟

Setup mock without changing `called` count

假设我想测试这个功能

def my_function():
    my_obj = MyClass()
    return my_obj.my_method()

我想模拟MyClass,所以我用unittest.mock.patch

@patch('...MyClass')
def test_my_function(MyClass):
    MyClass().my_method.return_value = 'foo'
    assert my_function() == 'foo'
    MyClass.assert_called_once()

此测试在最后一行失败并出现错误 AssertionError: Expected 'MyClass' to have been called once. Called 2 times.; ,从某种意义上说,是对的:第一次是test_my_function,当我设置了MyClass().my_method return值。

然而,我想表达的是 MyClass() 应该在 my_function 中实例化一次。

有没有一种方法可以在不更改中间模拟“调用”计数的情况下“准备”嵌套模拟(以便设置 return_value = 'foo')?

我傻了...用MyClass.return_value.my_method.return_value = 'foo'代替MyClass().my_method.return_value = 'foo'

就够了