2012-04-15 2 views
4

내 단위 테스트에서 assertRaises를 사용하여 특정 예외 발생을 테스트합니다. 내가 캡처해야 일부 예외 비록 단위 테스트에서 assertRaises와 함께 errno 사용

assertRaises(IOError, testToRun, passedValues) 

특정 오류 번호 (errno는), 그래서 대신 기본 예외를 수집의 그 예외에 관한 특정 오류 번호를 캡처하고 싶습니다.

try: 
    testToRun(passedValues) 
except IOError, e: 
    if e.errno == 2: 
     pass 
    else: 
     raise 

확실 해요 - : 내가 사용하고 specificly 번호 예외를 캡처 할 때 이런 식으로 뭔가, 그것은 분명히 :)

assertRaises(IOError.errno(2), testToRun, passedValue) 

이 해결하기 위해 작동하지 않습니다하지만 그것은 완벽하지는 않지만 작동하지만 assertRaises를 사용하여 같은 일을 할 수 있는지 궁금해했다.

감사합니다. 그런 다음

def assertRaisesErrNo(self, exc, errno, f, *args, **kwargs): 
    try: 
     self.assertRaises(exc, f, *args, **kwargs) 
    except IOError, e: 
     if e.errno == errno: 
      pass 
     else: 
      raise 

unittest.TestCase.assertRaisesErrNo = assertRaisesErrNo 

다른 assert처럼 사용

with self.assertRaises(SomeException) as cm: 
    do_something() 

the_exception = cm.exception 
self.assertEqual(the_exception.error_code, 3) 

답변

4

2.7 이후로는 컨텍스트 관리자와 assertRaises을 사용하는 것이 가능 방법 :

class TestSomething(unittest.TestCase): 
    def test_somthing(self): 
     self.assertRaisesErrNo(IOError, 2, myfunction) 

컨텍스트 관리자를 사용하여 매우 쉽게 contextlib.contextmanager

+0

답장을 보내 주셔서 감사합니다. 나는 컨텍스트 관리자에 익숙하지 않지만 그것에 대해 읽을 것이다. – user788462

-1

당신은 또한 당신의 현재 코드를 사용하여 새 TestCase의 기능을 만들 수 있습니다

+0

assertRaises 호출에서 예외를 처리하지 않으므로 특수 IOError 코드가 실행되지 않습니다. 이거 테스트 해봤 니? – user9876

관련 문제