在不更改“被调用”计数的情况下设置模拟
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'
就够了
假设我想测试这个功能
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'