unittest.TestCase 报错 `TypeError: Error when calling the metaclass bases __init__() 需要 2 个参数 (给了 4 个)`

1 投票
2 回答
1718 浏览
提问于 2025-04-18 15:32

我正在尝试给一个单元测试的 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))

撰写回答