首页 > 解决方案 > 如何在不改变其行为的情况下检查是否调用了 @patched-out python 方法?

问题描述

我一直在为我的测试用例使用 python模拟模块。我经常用装饰器装饰我的测试用例@patch('my_method')。然后在测试用例的主体中,我设置.return_value属性或.side_effect修补方法上的属性来模拟它的行为。同样在测试用例中,我检查了修补方法是否使用.assert_called_once(). 这工作正常。没问题。例子:

from mock import patch

@patch('my_method')
def test_case_1(self, mock_my_method):
    mock_my_method.return_value = None
    # Do some testing here
    mock_my_method.assert_called_once()

现在我想做一些稍微不同的事情:我只想检查一次修补的方法是否被调用(通过使用.assert_called_once().但是,我不想更改方法的行为,也不想指定假的返回值。我怎样才能做到这一点?

标签: pythonunit-testingmocking

解决方案


如果您只想使用patch它的调用记录功能,而不模拟原始函数的行为,则将原始函数指定为side_effect模拟函数:

@patch('my_function', side_effect=my_function)
...

这个side_effect名字具有误导性。如果一个模拟有一个side_effect函数,调用模拟将调用side_effectand return 或 raise 无论side_effect返回或 raise。使用原始函数 asside_effect意味着我们得到原始函数的行为。(side_effect可以是除了函数之外的其他几种东西,但我们在这里不需要那个函数。)


推荐阅读