unittest.TestCase 报错 `TypeError: Error when calling the metaclass bases __init__() 需要 2 个参数 (给了 4 个)`
我正在尝试给一个单元测试的 TestCase 添加属性,但总是遇到以下错误。
TypeError: 调用元类时出错,__init__() 需要两个参数(给了四个)
我用 nose 来运行测试。
但我只传了一个参数。self
让它变成了两个。所以我完全不知道第三个和第四个参数是从哪里来的。关于 unittest 或者 nose,有什么我应该知道的吗?
Base_Test.py
import unittest
from logUtils import logger
class Base_Test(unittest.TestCase):
def __init__(self, p4rev):
self.p4rev = p4rev
def setUp(self):
logger.critical(p4rev)
triggerSomething(p4rev)
My_test.py
from Base_Test import Base_Test
rev = '12345'
class check_error_test(Base_Test(rev)):
dosomething()
2 个回答
0
试试这个:
from Base_Test import Base_Test
rev = '12345'
class check_error_test(Base_Test):
def __init__(self):
super(check_error_test, self).__init__(rev)
dosomething()
之前不管用是因为你在设置继承关系的时候,错误地实例化了 Base_Test。关于 super() 的用法,Python 文档里有一段很不错的介绍,如果你想了解更多,可以去看看。
另外,我还建议把类名改成 CheckErrorTest,并把 Base_Test 改成 BaseTest,这样更符合 pep8 的规范。
1
当你从一个父类继承一个子类时,Python的写法是这样的:
class SubClassName(SupperClassName):
#子类的内容
但是在你的代码中,
class check_error_test(Base_Test(rev)):
dosomething()
你是在解析一个Base_Test类的实例,而不是这个类本身。Base_Test(rev)
会创建一个Base_Test类的实例。
你可以把你的代码修改成下面这样。
class check_error_test(Base_Test):
def __init__(p4rev):
super(check_error_test).__init__(p4rev)
Base_Test也是一个从unittest.TestCase继承的类,所以你需要在Base_Test.py中添加:
class Base_Test(unittest.TestCase):
def __init__(self, methodName='runTest', p4rev=None):
super(Base_Test, self).__init__(methodName)
self.p4rev = p4rev
def runTest(self):
pass
在BaseTest类中添加了runTest()方法,目的是为了避免unittest.TestCase类抛出的ValueError错误。如果没有找到与methodName参数传入的名字对应的方法,unittest.TestCase就会抛出这个错误。
下面是引发ValueError的代码片段,这段代码在unittest.TestCase的init()方法中。
def __init__(self, methodName='runTest'):
"""Create an instance of the class that will use the named test
method when executed. Raises a ValueError if the instance does
not have a method with the specified name.
"""
self._testMethodName = methodName
self._resultForDoCleanups = None
try:
testMethod = getattr(self, methodName)
except AttributeError:
raise ValueError("no such test method in %s: %s" %
(self.__class__, methodName))