我试图对一个继承的类进行单元测试,该类的基类实现了 __init_subclass__方法.代码如下:

quick_test.py

import unittest
from unittest.mock import create_autospec

class Parent():

    PROPERTY = NotImplemented

    def __init_subclass__(cls, **kwargs):
        if cls.PROPERTY is NotImplemented:
            raise NotImplementedError("Please implement the `PROPERTY`.")
        super().__init_subclass__(**kwargs)

    def __init__(self, connection_type="default"):
        self.connection_type = connection_type


class Child(Parent):

    PROPERTY = "has value"


class ChildNoProp(Parent):
    pass


class TestClass(unittest.TestCase):

    def test_required_params(self):
        mock = create_autospec(Child)
        self.assertRaises(NotImplementedError, mock)


if __name__ == '__main__':
    unittest.main()

问题是我甚至无法访问测试用例,因为ChildNoProp个定义在基类中调用__init_subclass__并引发异常.

是否有一种方法可以用当前的实现对此进行单元测试,或者我应该在__init_subclass__中放弃错误引发?

推荐答案

可以在assertRaises块内创建类.

with self.assertRaises(NotImplementedError):
    class ChildNoProp(Parent):
        pass

如果方法中的class声明让您感到不舒服,那么可以直接使用type构造函数.

with self.assertRaises(NotImplementedError):
    type("ChildNoProp", (Parent,), {})

Python相关问答推荐

Inquirer库不适用于Pyterfly

如何随着收件箱的增加动态添加到HTML表的右下角?

Python-Polars:如何用两个值的平均值填充NA?

在Transformer中使用LabelEncoding的ML模型管道

inspect_asm不给出输出

使用argsorted索引子集索引数组

如何终止带有队列的Python进程?+ 队列大小的错误?

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

从webhook中的短代码(而不是电话号码)接收Twilio消息

将两只Pandas rame乘以指数

在Python Attrs包中,如何在field_Transformer函数中添加字段?

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

OR—Tools CP SAT条件约束

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

Pandas Loc Select 到NaN和值列表

Python列表不会在条件while循环中正确随机化'

用渐近模计算含符号的矩阵乘法

需要帮助重新调整python fill_between与数据点

matplotlib图中的复杂箭头形状

在Python中使用yaml渲染(多行字符串)