2016-12-23 69 views
0

我將呼叫改爲bar,它們同時返回Future。當bar的方法實際執行時,將產生一個ValueError。 單元測試實際上確保了這一點。assertRaises不與期貨合作

現在改變

self.assertRaises(ValueError, foo.bar("/my/invalid/path")) 

self.assertRaises(ValueError, fut.result()) 

不再是出於某種原因一個有效的斷言。

整個新的代碼是:

fut = foo.bar("/my/invalid/path") 
self.assertIsNotNone(fut) 
self.assertRaises(ValueError, fut.result()) 

堆棧跟蹤則是:

"test.py", line 25, in test_load_invalid_res 
self.assertRaises(ValueError, fut.result()) 
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 398, in result 
    return self.__get_result() 
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 357, in __get_result 
    raise self._exception 
File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run 
    result = self.fn(*self.args, **self.kwargs) 
ValueError: Could not find resource in resource path: /my/invalid/path 

但堆棧跟蹤實際上是告訴我,有一個ValueError!?爲什麼它在assertRaises之外傳播?

編輯:

下面的代碼不起作用:

try: 
    fut.result() 
except ValueError as e: 
    pass 

什麼工作是例如: -

try: 
    fut.result() 
except Exception as e: 
    self.assertIsInstance(e, ValueError) 

回答

0

您所呼叫的方法和結果傳遞給assertRaises。由於錯誤發生在assertRaises被調用之前,它不會捕獲異常。

assertRaises需要一個可調用的函數,它在try/except中調用它自己。你的代碼應該是:

self.assertRaises(ValueError, fut.result) 

沒有調用parens。或者,您可以將其用作上下文管理器:

with self.assertRaises(ValueError): 
    fut.result() 
+0

當然。感謝 - 需要休假;) – abergmeier