How to use assertRaises in a trial test case using inlineCallbacks
我正在试图找出如何编写一个断言异常的测试用例。
目前我有两种简单的测试方法(成功和失败)。每个方法都返回一个已被回调或返回的延迟。测试成功的方法可以正常工作。在测试失败方法时,我希望能够断言引发了异常(使用断言引发)。
但是测试用例失败了,我得到:
1 | twisted.trial.unittest.FailTest: ConnectionRefusedError not raised (<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> returned) |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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) |
我在测试失败时是否使用了正确的方法?我可以使用try…catch绕过self.o.failure的调用,但我认为这种方法不如使用assertraise。
用
1 | yield self.assertFailure(self.o.failure(), ConnectionRefusedError) |
从Twisted 12.3开始,还有一个
1 | self.failureResultOf(self.o.failure()).trap(ConnectionRefusedError) |
从13.1开始,这个API接受一个额外的参数,并为您执行类型检查:
1 | self.failureResultOf(self.o.failure(), ConnectionRefusedError) |
这对于您知道
对于您的示例代码,这将很好地工作,并且应该适用于大多数单元测试。如果您正在使用trial编写功能或集成测试,其中实际正在进行异步工作,并且您不知道