Python模拟补丁实例方法和检查调用参数

时间:2015-05-27 16:24:27

标签: python unit-testing mocking python-mock

我在Python 2.7中使用Mock(http://mock.readthedocs.org/en/latest/)库。我有一个main函数调用我试图测试的其他一些函数。

它调用的其他函数是其他实例方法(例如,def _other_function(self, a, b)

我正在调用我的主函数,我还有其他函数,它调用了补丁。我刚刚在补丁中添加了autospec=True。但是当我检查调用参数时,它会显示self参数(如预期的那样):

python2.7> _other_function_mock.call_args_list
[call(<some.module.class.method object at 0x9acab90>, 1, 2)]

在设置autospec=True之前,它只会显示我实际传递的参数(1和2)。从现在开始,call args显示对self的引用,我不能只调用mock_object.assert_any_call(1, 2)。我需要从mock_object.call_args_list中挑选出来并进行比较。

有没有办法仍然可以调用mock.assert_any_call而无需手动选择参数来检查传递的参数是否正确?

或者,我是否可以采取更好的方法来修补实例方法?

1 个答案:

答案 0 :(得分:9)

基本上有两种方法可以围绕self补丁autospec=True引用。

  1. 使用mock.ANY忽略第一个参数
  2. patch.object修补对象,而不是修补静态方法参考。
  3. 无论如何 2 无法在所有情况下使用,有时您无法在测试方法上下文中拥有对象实例;而且这种方式往往使测试不那么清晰和复杂。我总是喜欢在我的测试中使用 1

    @patch("my_module.MyClass.my_method", autospec=True)
    def test_my_test(self, mock_my_method):
        my_module.MyClass().my_method(1,2)
        mock_my_method.assert_any_call(mock.ANY, 1, 2)