2016-12-23 7 views
0

Я сменил звонок на bar, который вернулся синхронно, чтобы вернуть Будущее. Когда фактически выполняется метод 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?

EDIT:

Следующий код не работает:

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

Что работает, например .:

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

ответ

0

Вы вызываете метод и передавая результат assertRaises. Поскольку ошибка возникает до вызова assertRaises, она не будет вызывать исключения.

assertRaises принимает вызов, который он называет себя в попытке/исключении. Ваш код должен быть:

self.assertRaises(ValueError, fut.result) 

без вызывающих парнеров. В качестве альтернативы вы можете использовать его в качестве менеджера контекста:

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

Конечно. Спасибо - нужен отпуск;) – abergmeier

 Смежные вопросы

  • Нет связанных вопросов^_^