2017-02-17 8 views
1

Я получаю следующее сообщение об ошибке__init__ принимает один аргумент 2 дается UnitTest

TypeError: __init__() takes exactly 1 argument (2 given) 

Когда я запускаю следующий питона:

import unittest 
from unittest import TestCase 

class myClass(unittest.TestCase): 

    def __init__(self): 
     pass 

if __name__ == '__main__': 
    unittest.main(argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2)) 

Любые идеи? Мне нужно запустить init, так как я хочу ТОЛЬКО выполнять мою настройку один раз. Не один раз для каждого теста. Это будет большой оптимизацией для общего времени тестирования.

Вот остальная часть ползания стека:

Traceback (most recent call last): 
File "./RestEditRecord.py", line 1439, in <module> 
unittest.main(argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2)) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 94, in __init__ 
self.parseArgs(argv) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 149, in parseArgs 
self.createTests() 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/main.py", line 155, in createTests 
self.test = self.testLoader.loadTestsFromModule(self.module) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 65, in loadTestsFromModule 
tests.append(self.loadTestsFromTestCase(obj)) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 56, in loadTestsFromTestCase 
loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames)) 
TypeError: __init__() takes exactly 1 argument (2 given) 
+0

D Вам нужно вызвать супер конструктор? –

+1

Используйте '' setUpClass() '] (https://docs.python.org/3/library/unittest.html#unittest.TestCase.setUpClass) вместо' __init __() '. – Kevin

ответ

0

Read the docs for the class you're extending; Инициализатор unittest.TestCase принимает необязательный аргумент, и если вы его не принимаете, и он будет передан, вы получите эту ошибку.

В любом случае редко есть повод для переопределения __init__ для TestCase; установка теста выполняется в setUp (выполняется один раз за тест, поэтому измененное состояние из одного теста не влияет на поведение другого теста), а не __init__ (пробег один раз). Вы наследуете __init__, и поскольку ваш __init__ ничего не делает, глупо иметь его вообще.

Если вы сделать имеют законное использование для этого, убедитесь, что вы делегировать инициализацию вверх по цепочке:

class Suite_Edit_AutoEntry(unittest.TestCase): 

    def __init__(self, *args, **kwargs): # Accept all unrecognized args for delegation 
     # Delegate to parent initializer 
     super().__init__(*args, **kwargs) # On Py2, super(Suite_Edit_AutoEntry, self)... 
     ... do additional initialization here ... 

Конечно, как было отмечено в комментариях, вы можете иметь отдельную установку класса (по состоянию на Python 2.7/3.2) using setupClass, так что вам не обязательно иметь дело с __init__.

+0

Мой пример выше делает только пропуск, но мой настоящий тест выполняет некоторую подготовительную работу для базы данных. Например, усечение таблицы и создание группы записей, которые каждый из тестов может выполнять поиск. Я буду играть/читать как init, так и setUpClass(), чтобы узнать, что имеет больше смысла. TY для помощи ребятам. Приятного вечера. Извините, я привык к C++, который не требует вызова базового класса, если вы не хотите его функциональности, и я не делал C++ в то время, так что, возможно, это тоже изменилось. – Keith

+0

OK метод init выше не работает для меня, но метод setUpClass() компилируется и запускается без ошибок. Завтра я выясню остальное. – Keith