2012-04-15 71 views
4

我在單元測試中使用assertRaises來測試引發特定異常。在單元測試中使用帶assertRaises的errno

assertRaises(IOError, testToRun, passedValues) 

雖然一些我需要捕捉異常的具有特定的錯誤號(錯誤),所以不是收集基礎例外,我想捕獲與該異常的特定錯誤編號。像這樣的東西,但它顯然是行不通的:)

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

爲了解決這個問題,當我想捕捉specificly編號例外,我一直使用: -

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

我敢肯定它不是完美的,但它的工作原理,但想知道是否有可能使用assertRaises來做同樣的事情是一個更緊湊的方式。

謝謝。

回答

4

因爲2.7是可以使用assertRaises與上下文經理:

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

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

感謝您的答覆。我不熟悉上下文管理器,但會閱讀它。 – user788462 2012-04-16 04:00:40

-1

你也可以使用當前的代碼創建一個新的TestCase功能:

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方法:

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

你也可以把它變成一個上下文管理相當容易使用contextlib.contextmanager

+0

assertRaises調用不處理異常,所以您的特殊IOError代碼永遠不會運行?你測試過了嗎? – user9876 2013-01-24 13:41:34

相關問題