Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.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_Testing_Mocking_Pytest - Fatal编程技术网

Python 如何修补类的新方法

Python 如何修补类的新方法,python,testing,mocking,pytest,Python,Testing,Mocking,Pytest,我的目标是修补一个类“\uuuuu new\uuuu方法,以便控制它在测试用例中创建的确切对象。请参阅下面的代码 当单独运行时,两个测试test_1和test_2中的每一个都按预期工作。但是,当它们都连续运行时,test_2失败,原因是: TypeError:object.\uuuu new\uuuuu()只接受一个参数(要实例化的类型) 即使我存储了原始的\uuuu new\uuu方法指针,并在test\u 1结束时将其还原(pytest无论如何都会处理这些事情),它仍然会产生相同的结果 知道

我的目标是修补一个类“
\uuuuu new\uuuu
方法,以便控制它在测试用例中创建的确切对象。请参阅下面的代码

当单独运行时,两个测试
test_1
test_2
中的每一个都按预期工作。但是,当它们都连续运行时,
test_2
失败,原因是:

TypeError:object.\uuuu new\uuuuu()只接受一个参数(要实例化的类型)

即使我存储了原始的
\uuuu new\uuu
方法指针,并在
test\u 1
结束时将其还原(pytest无论如何都会处理这些事情),它仍然会产生相同的结果

知道这是怎么回事吗?为了实现我的目标,工作方法是什么

导入pytest
#班级:
A类:
定义初始化(self,x):
self.x=x
def测试_1(模拟机):
“”“第一个测试修补新方法。”“”
#创建对象:
a=a(x=3)
#确保新方法始终返回此对象:
mocker.patch.object(A,“\uuuuu new\uuuuuuuu”,返回值=A)
#关闭初始值设定项(这样它就不会覆盖预制对象中的值):
mocker.patch.object(A,“\uuuuu init\uuuuuuuu”,返回值=None)
#进行测试:
res=A(x=1)
断言res.x==3
def测试_2():
“”“第二个测试按预期使用该类。”“”

A(2)#首先,如果您使
A
对象
继承并重写
\uuuuuuuuuuuuuuuu
使其返回
超级(A,cls)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是我不能告诉你为什么!另外,你为什么要在
\uuuuu new\uuuuuu
中进行修补呢?@OctaveL这是测试一个函数的最直接的方法,该函数使用了一个具有一些昂贵初始化方法的类。然而,我现在修改了代码,使其能够以不同的方式进行测试,从而解决了我眼前的问题。不过,这仍然是一个有趣的谜语。我花了一段时间寻找,到目前为止,我还是画了一个空白。我只是想让你知道我强迫
A
对象
继承是错误的,因为它在默认情况下这样做是不必要的(我知道这一点,但我认为没有它就无法工作,原因不明。事实并非如此)