我正在试图找出如何编写一个试验测试用例,该测试用例会引发异常。
目前我有两种简单的方法来测试(成功和失败)。每个方法都返回一个已经回调或错误返回的延迟。测试成功方法很好。在测试失败方法时,我希望能够断言引发了异常(使用assertRaises)。
然而,测试用例失败了,我得到了:
twisted.trial.unittest.FailTest: ConnectionRefusedError not raised (<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> returned)
代码如下:
from twisted.trial.unittest import TestCase from twisted.internet.defer import inlineCallbacks, succeed, fail from twisted.internet.error import ConnectionRefusedError class MyObject: def success(self): return succeed(True) def failure(self): return fail(ConnectionRefusedError()) class TestErrBack(TestCase): def setUp(self): self.o = MyObject() @inlineCallbacks def test_success(self): result = yield self.o.success() self.assertTrue(result) @inlineCallbacks def test_failure(self): # this test case is failing ! yield self.assertRaises(ConnectionRefusedError, self.o.failure)
我在test_failure中使用正确的方法吗? 我可以使用try ...来调用self.o.failure,但我不认为这种方法与使用assertRaises一样好。
答案 0 :(得分:13)
改为使用TestCase.assertFailure
:
yield self.assertFailure(self.o.failure(), ConnectionRefusedError)
从Twisted 12.3开始,还有一个TestCase.failureResultOf
助手:
self.failureResultOf(self.o.failure()).trap(ConnectionRefusedError)
从13.1开始,这个API需要一个额外的参数并为你执行类型检查:
self.failureResultOf(self.o.failure(), ConnectionRefusedError)
这对于知道 Deferred
已经触发了结果的测试非常有用。如果Deferred
在调用时没有失败结果,failureResultOf
会引发测试失败的异常,而不是返回失败。
这适用于您的示例代码,应该适用于大多数单元测试。如果您正在使用试用版编写功能或集成测试,而实际的异步工作正在进行,并且您不知道Deferred
何时会触发,那么您需要坚持使用第一个API,assertFailure