يحصل Unittest.TestCase على خطأ في النوع:حدث خطأ عند استدعاء قواعد metaclas __init__() يأخذ وسيطتين بالضبط (4 معطى)`
-
23-12-2019 - |
سؤال
أحاول إضافة سمات إلى Unittest TestCase، لكني أتلقى الخطأ التالي باستمرار.TypeError: Error when calling the metaclas bases __init__() takes exactly 2 arguments (4 given)
أقوم بإجراء الاختبارات بالأنف.
لكنني أمرر حجة واحدة فقط. self
يجعلها اثنين.لذلك ليس لدي أي فكرة عن مصدر الوسيطتين الثالثة والرابعة.هل هناك شيء في Unittest يجب أن أكون على علم به؟أو الأنف؟
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()
المحلول
عند الوراثة من فئة فرعية من فئة العشاء يأتي بناء جملة بايثون على النحو التالي:
اسم الفئة الفرعية (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
تمت إضافة runTest() هناك في فئة BaseTest فقط لتجنب زيادة ValueError بواسطة فئة Unittest.TestCase.يعرض Unittest.TestCase هذا الخطأ إذا لم يكن هناك طريقة يمكن العثور عليها من خلال الاسم الذي تم تمريره إلى معلمةmethodName.
يوجد أدناه مقطع التعليمات البرمجية الذي يؤدي إلى ظهور ValueError الموجود في Unittest.TestCase.فيه()
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))
نصائح أخرى
جرب هذا:
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 أثناء إعداد الميراث لـ check_error_test.هناك قسم جيد في وثائق بايثون على super() أيضًا، إذا كنت ترغب في معرفة المزيد حول كيفية عمل ذلك.
بالإضافة إلى ذلك، أوصي أيضًا بكتابة اسم الفئة بأحرف كبيرة إلى CheckErrorTest وتغيير Base_Test إلى BaseTest، وفقًا لـ pep8 القواعد الارشادية.