У меня возникает странная проблема при использовании unittest.assertRaises
. При выполнении приведенного ниже кода я получаю следующий результат:assertRaises просто улавливает базовое исключение
E
======================================================================
ERROR: testAssertRaises (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\home\python_test\src\derived.py", line 29, in testAssertRaises
self.assertRaises(MyError, self.raiser.raiseMyError)
File "C:\Programme\Python26\lib\unittest.py", line 336, in failUnlessRaises
callableObj(*args, **kwargs)
File "C:\home\python_test\src\derived.py", line 15, in raiseMyError
raise MyError("My message")
MyError: 'My message'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
Исправлено исключение, но тест не срабатывает! Если я поймаю BaseError
, тест пройдет успешно.
Как-то это похоже на проблему с областью unittest, которая не может видеть класс исключений MyError
. Может ли кто-нибудь объяснить это? Есть ли способ обхода?
Я тестирую следующий код Python, который представляет собой реализацию для динамического построения объектов по именам классов.
Это базовый модуль "bases.py":
class BaseClass(object):
@staticmethod
def get(className):
module = __import__("derived", globals(), locals(), [className])
theClass = getattr(module, className)
return theClass()
class BaseError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
Это модуль для тестирования, "derived.py":
import unittest
from bases import BaseError
from bases import BaseClass
class MyErrorRaiser(BaseClass):
def raiseMyError(self):
raise MyError("My message")
class MyError(BaseError):
'''
'''
class Test(unittest.TestCase):
def setUp(self):
self.raiser = BaseClass.get("MyErrorRaiser")
def testAssertRaises(self):
self.assertRaises(MyError, self.raiser.raiseMyError)
if __name__ == "__main__":
unittest.main()
А, это имеет смысл. Любая идея, как лучше реализовать это? Я уже заметил, что он работает, если переместить исключения в отдельный модуль. – desolat
Перемещение исключений устранит эту проблему, но у вас все еще есть две разные копии одного и того же модуля, и позже могут возникнуть другие проблемы. Вам нужно как-то убедиться, что основной модуль не будет импортирован другим модулем. Я не знаю, зачем вам нужен метод «BaseClass.get», поэтому я не могу сказать вам, как его улучшить, за исключением того, чтобы не называть его в модульном тесте. – interjay