Python 在不调用类的初始值设定项的情况下测试类

Python 在不调用类的初始值设定项的情况下测试类,python,testing,mocking,pytest,Python,Testing,Mocking,Pytest,我的目标是在不调用其初始值设定项的情况下测试类(因为初始值设定项有一些副作用,我想防止该测试发生) 我可以通过test_1中的代码来实现这一点,该代码本身运行良好。然而,它似乎以某种方式污染了init/new方法,因为test_2在test_1之后运行时失败,原因是: TypeError:object.\uuuu new\uuuuu()只接受一个参数(要实例化的类型) 单独运行每个测试时,它们都通过 你知道这里发生了什么吗?我如何解决这个问题,也就是说,在模拟和测试之后如何正确地重置init/n

我的目标是在不调用其初始值设定项的情况下测试类(因为初始值设定项有一些副作用,我想防止该测试发生)

我可以通过
test_1
中的代码来实现这一点,该代码本身运行良好。然而,它似乎以某种方式污染了init/new方法,因为
test_2
test_1
之后运行时失败,原因是:

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

单独运行每个测试时,它们都通过

你知道这里发生了什么吗?我如何解决这个问题,也就是说,在模拟和测试之后如何正确地重置init/new方法

导入pytest
#要测试的类:
A类:
定义初始化(self,x):
self.x=x
def测试_1(模拟机):
“”“第一个测试在不触发初始值设定项的情况下使用该类。”“”
#在不触发初始值设定项的情况下创建对象:
a=a.。\uuuu新的\uuuuu(a)
#存储旧方法:
新的源=新的__
初始值=A.\u初始值__
#模拟新/初始化方法:
mocker.patch.object(A,“\uuuuu new\uuuuuuuu”,返回值=A)
mocker.patch.object(A,“\uuuuu init\uuuuuuuu”,返回值=None)
#进行测试:
res=A()
# ...
#还原新的/init方法:
A.。\uuuu init\uuuuu=init\u orig
A.。\uuuuu新的\uuuuu=新的
def测试_2():
“”“第二个测试按预期使用该类。”“”
A(2)

如果您只想避免调用
\uuuuu init\uuuuuuu
,则可以使用以下代码执行此操作,而无需在
\uuuu new\uuuuuu
中进行修补

import pytest


# The class to test:
class A:
    def __init__(self, x):
        self.x = x


def test_1(mocker):
    """First test uses the class without triggering the initializer."""
    mocker.patch.object(A, "__init__", return_value=None)
    # Do the test:
    res = A()
    with pytest.raises(AttributeError):
        print(res.x)
    # ...


def test_2():
    """Second test uses the class as intended."""
    a = A(2)
    assert(a.x == 2)

也不需要存储新的/init方法。

如果您只想避免调用
\uuuuuu init\uuuuu
,则可以使用以下代码执行此操作,而无需在
\uuuu new\uuuuu
中进行修补

import pytest


# The class to test:
class A:
    def __init__(self, x):
        self.x = x


def test_1(mocker):
    """First test uses the class without triggering the initializer."""
    mocker.patch.object(A, "__init__", return_value=None)
    # Do the test:
    res = A()
    with pytest.raises(AttributeError):
        print(res.x)
    # ...


def test_2():
    """Second test uses the class as intended."""
    a = A(2)
    assert(a.x == 2)

也不需要存储新的/init方法。

Super!谢谢。你的代码显然更好,更直观。不过,你知道为什么我的变种不起作用吗?@myke坦率地说,我看了看,但不明白!我很好奇,所以改天我可能会更深入地研究它。非常奇怪的是,在函数结束时,补丁没有正确恢复,我想我们正在处理一个奇怪的特殊情况。谢谢,@OctaveL,事实证明,我不仅需要停用init,还需要为我的代码修补新的补丁。因此,我为此添加了一个新问题。也许你想看看:@myke我来看看!超级的!谢谢。你的代码显然更好,更直观。不过,你知道为什么我的变种不起作用吗?@myke坦率地说,我看了看,但不明白!我很好奇,所以改天我可能会更深入地研究它。非常奇怪的是,在函数结束时,补丁没有正确恢复,我想我们正在处理一个奇怪的特殊情况。谢谢,@OctaveL,事实证明,我不仅需要停用init,还需要为我的代码修补新的补丁。因此,我为此添加了一个新问题。也许你想看看:@myke我来看看!