【问题标题】:assertRaises not working with FuturesassertRaises 不适用于期货
【发布时间】:2016-12-23 12:41:59
【问题描述】:

我更改了对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)

【问题讨论】:

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


    【解决方案1】:

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

    assertRaises 接受一个可调用对象,它在 try/except 中调用它自己。你的代码应该是:

    self.assertRaises(ValueError, fut.result)
    

    没有调用括号。或者,您可以将其用作上下文管理器:

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

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 2016-12-08
      • 2013-05-23
      • 2019-10-24
      • 1970-01-01
      • 2019-06-29
      • 2016-08-10
      • 2019-05-08
      • 1970-01-01
      相关资源
      最近更新 更多