python 3.x 中的单元测试 __init_subclass__ 方法

unit testing __init_subclass__ method in python 3.x

我正在尝试对继承的 class 进行单元测试,其基础 class 实现了 __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 定义在基础 class 中调用 __init_subclass__ 并引发异常。

有没有一种方法可以用当前的实现对其进行单元测试,或者我应该放弃 __init_subclass__ 中出现的错误?

您可以在 assertRaises 块中创建 class。

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

如果方法内部的class声明让你不舒服,你可以直接使用type构造函数。

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