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,), {})
我正在尝试对继承的 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,), {})