Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模拟补丁实例方法和检查调用参数_Python_Unit Testing_Mocking_Python Mock - Fatal编程技术网

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

Python模拟补丁实例方法和检查调用参数,python,unit-testing,mocking,python-mock,Python,Unit Testing,Mocking,Python Mock,我在Python2.7中使用Mock()库。我有一个main函数,它调用我正在测试的一些其他函数 它调用的其他函数是其他实例方法(例如,def\u other\u函数(self,a,b)) 我正在调用我的主函数,它调用的其他函数也已修补。我刚刚在修补程序中添加了autospec=True。但是,当我检查调用参数时,它会显示一个self参数(如预期的那样): python2.7>\其他\函数\模拟调用\参数\列表 [呼叫(,1,2)] 在设置autospec=True之前,它只会显示我实际传递的

我在Python2.7中使用Mock()库。我有一个main函数,它调用我正在测试的一些其他函数

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

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

python2.7>\其他\函数\模拟调用\参数\列表
[呼叫(,1,2)]
在设置
autospec=True
之前,它只会显示我实际传递的参数(1和2)。由于现在调用参数显示对
self
的引用,我不能只调用
mock\u对象。断言任何调用(1,2)
。我需要从
mock\u对象中选择参数。调用参数列表
并进行比较

是否有一种方法可以仍然调用
mock.assert\u any\u调用
,而不必手动选择参数来检查传递的参数是否正确


或者,一般来说,我可以做些更好的事情来修补实例方法吗?

基本上,有两种方法可以解决
autospec=True
修补程序的
self
参考问题

  • 用于忽略第一个参数
  • 通过
    Patch.object
    修补对象,而不是修补静态方法引用
  • 无论如何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)
    
    @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)