Python 3.x中对__init_subclass__方法进行单元测试

4

我正在尝试对一个继承类进行单元测试,该类的基类实现了__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__中引发错误?

1
ChildNoProp 的定义放在测试内部。 - Mad Physicist
1个回答

3

你可以在assertRaises块内创建类。

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

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

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

谢谢,看起来Python确实像他们说的那样整洁。这将被添加到我的备忘录! - SolMcNugget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接