断言不与期货合作

时间:2016-12-23 12:42:00

标签: python python-3.x python-unittest concurrent.futures

我改变了对bar的调用,该调用同步返回以返回Future。当bar的方法实际执行时,它会引发ValueError。 单元测试确实确保了。

现在正在改变

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)

1 个答案:

答案 0 :(得分:0)

您正在调用该方法并将结果传递给assertRaises。由于错误发生在调用assertRaises之前,因此它不会捕获异常。

assertRaises使用一个可调用的函数,它在try / except中调用它自己。你的代码应该是:

self.assertRaises(ValueError, fut.result)
没有呼叫的parens。或者,您可以将其用作上下文管理器:

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