2016-12-23 7 views
0

私はbarへの呼び出しを、Futureを返すことに同期して返しました。 barのメソッドが実際に実行されると、ValueErrorが発生します。 単体テストでは実際にそれが保証されています。assertRaisesが先物で動作しません

今すぐ

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

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

を変更することは、もはや何らかの理由で有効アサートされません。

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を超えて伝播していますか?

EDIT:

次のコードは動作しません:

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) 

となります。代わりに、コンテキストマネージャとして使用することもできます。

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

もちろんです。ありがとうございます - 休暇が必要です;) – abergmeier

関連する問題