unittest.assertRaises
을 사용할 때 이상한 문제가 발생합니다. 아래 코드를 실행하면 다음과 같은 결과가 출력됩니다.assertRaises가 기본 예외를 catch합니다.
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 코드를 테스트하고 있습니다.
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