Python 单元测试的继承导致错误
Inheritance for Python unit tests leads to error
当我 运行 下面的代码片段时,出现错误:
'TypeError: __init__() takes 1 positional argument but 2 were given'.
但是,如果我删除 unittest.Main()
并只创建 B 的一个实例:b = B()
,它工作正常并按应有的方式调用 A 的构造函数。
编辑 2:A 并不意味着 运行 作为单元测试。只有A,它继承了B。
编辑:我想通过这种继承(虽然在代码片段中没有很好地显示)来完成的是为两个单元测试创建一个公共基础 class .
import unittest
from unittest import TestCase
class A(TestCase):
def __init__(self, message):
print(message)
class B(A):
def __init__(self):
super().__init__('It works!')
def test_function(self):
print('B - test method')
unittest.main()
根据文档,TestCase
构造函数有一个可选参数:
class unittest.TestCase(methodName='runTest')
但是你的构造函数没有:
class B(A):
def __init__(self):
super().__init__('It works!')
这就是为什么当 unittest 尝试实例化您的测试用例时,会抛出您观察到的 TypeError: __init__() takes 1 positional argument but 2 were given
异常。
当您继承 TestCase
时,您必须考虑它的参数。最好使用可变参数 *args, **kwargs
,因为它可以转发任意数量的位置参数或关键字参数:
class A(TestCase):
def __init__(self, message, *args, **kwargs):
super().__init__(*args, **kwargs)
print(message)
class B(A):
def __init__(self, *args, **kwargs):
super().__init__('It works!', *args, **kwargs)
def test_function(self):
print('B - test method')
确保不要忘记在 A
的构造函数中调用 super().__init__
- 这是您代码中的另一个问题。
当我 运行 下面的代码片段时,出现错误:
'TypeError: __init__() takes 1 positional argument but 2 were given'.
但是,如果我删除 unittest.Main()
并只创建 B 的一个实例:b = B()
,它工作正常并按应有的方式调用 A 的构造函数。
编辑 2:A 并不意味着 运行 作为单元测试。只有A,它继承了B。
编辑:我想通过这种继承(虽然在代码片段中没有很好地显示)来完成的是为两个单元测试创建一个公共基础 class .
import unittest
from unittest import TestCase
class A(TestCase):
def __init__(self, message):
print(message)
class B(A):
def __init__(self):
super().__init__('It works!')
def test_function(self):
print('B - test method')
unittest.main()
根据文档,TestCase
构造函数有一个可选参数:
class unittest.TestCase(methodName='runTest')
但是你的构造函数没有:
class B(A):
def __init__(self):
super().__init__('It works!')
这就是为什么当 unittest 尝试实例化您的测试用例时,会抛出您观察到的 TypeError: __init__() takes 1 positional argument but 2 were given
异常。
当您继承 TestCase
时,您必须考虑它的参数。最好使用可变参数 *args, **kwargs
,因为它可以转发任意数量的位置参数或关键字参数:
class A(TestCase):
def __init__(self, message, *args, **kwargs):
super().__init__(*args, **kwargs)
print(message)
class B(A):
def __init__(self, *args, **kwargs):
super().__init__('It works!', *args, **kwargs)
def test_function(self):
print('B - test method')
确保不要忘记在 A
的构造函数中调用 super().__init__
- 这是您代码中的另一个问题。