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
Python:what';是对模拟对象的函数调用吗?_Python_Unit Testing_Testing_Mocking - Fatal编程技术网

Python:what';是对模拟对象的函数调用吗?

Python:what';是对模拟对象的函数调用吗?,python,unit-testing,testing,mocking,Python,Unit Testing,Testing,Mocking,我偶然发现了这种符号: >>> m = mock.Mock() >>> m().my_value = 5 >>> >>> m <Mock id='139823798337360'> >>> m() <Mock name='mock()' id='139823798364240'> m = mock.Mock() m().my_value = 5 所以这一定是某种模拟魔法。它是

我偶然发现了这种符号:

>>> m = mock.Mock()
>>> m().my_value = 5
>>> 
>>> m
<Mock id='139823798337360'>
>>> m()
<Mock name='mock()' id='139823798364240'>

m = mock.Mock()
m().my_value = 5

所以这一定是某种模拟魔法。它是什么及其用途?

在Python中,任何对象都可以调用,只要它实现了方法

任何函数都可以在函数对象实现时调用。此外,所有类都是可调用的。因此,您可以创建该类的实例

在您的类中,如果添加
\uuuuu call\uuuu
,它将如下所示

class C(object):
    def __call__(self, *args):
        print("instance is called with %s", tuple(args))

Mock
类定义了
\uuuuu调用
,这样您就可以跟踪对Mock对象的调用

>>> m = Mock()
>>> m(3, 4)
<Mock name='mock()' id='140219558391696'>
>>> m.mock_calls
[call(3, 4)]
>>> 
>m=Mock()
>>>m(3,4)
>>>m.mock_呼叫
[电话(3、4)]
>>> 

我会回答这个问题,因为我的问题似乎不太清楚。 So符号:

>>> m = mock.Mock()
>>> m().my_value = 5
>>> 
>>> m
<Mock id='139823798337360'>
>>> m()
<Mock name='mock()' id='139823798364240'>

m = mock.Mock()
m().my_value = 5

用于模拟工厂函数。当需要模拟返回具有特定属性的对象的函数时。每次调用
m()
都会返回与
m
本身不同的模拟对象,但每次都是相同的(通常每次调用工厂函数都会返回一个新对象)。因此,当设置此对象的属性时(如
m().my_value=5
),它将在以后调用
m()

时可用。请澄清您的问题好吗?目前至少有两个子问题,而且范围相当广泛。请注意,函数是对象,因此从技术上讲,
()
是一个对象调用。因此,显然Mock定义了
\uuuuu call\uuuuuu()
,它的预期用途是什么?与Mock上的任何其他操作相同。模拟可在真实对象上执行的操作。函数只是类型为
function
的对象,并不是唯一可调用的类型。您一直在调用非函数对象。例如,
mock.mock
不是一个函数,而是一个类。通常通过调用类来实例化类。函数是对象,但对象不是函数。调用类是实际调用构造函数(函数)的约定。这是我困惑的根源,调用一个类(通常)会创建一个对象,调用一个对象只会执行该对象的一个特殊函数(如果定义了)。对,在这种情况下,Mock的行为就像一个函数,这很好。那么``m(3,4)`some_attribute=7``首先我们想让mock作为一个函数,然后把它作为一个对象来使用,并操纵它的属性。这也没关系,这是为了模拟一个对象的行为。考虑
re.search().group
re.search()
返回一个匹配对象,该对象具有名为
group
的属性。