يحصل Unittest.TestCase على خطأ في النوع:حدث خطأ عند استدعاء قواعد metaclas __init__() يأخذ وسيطتين بالضبط (4 معطى)`

StackOverflow https://stackoverflow.com//questions/25066836

  •  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 القواعد الارشادية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top