12

我试图弄清楚如何编写一个断言引发异常的试验测试用例。

目前我有两种简单的测试方法(成功和失败)。每个方法都返回一个 deferred,它已经被 callback'd 或 errback'd。测试成功方法工作正常。在测试失败方法时,我希望能够断言引发了异常(使用 assertRaises)。

但是测试用例失败了,我得到:

twisted.trial.unittest.FailTest:ConnectionRefusedError 未引发(<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> 返回)

代码如下:

从 twisted.trial.unittest 导入 TestCase
从 twisted.internet.defer 导入 inlineCallbacks,成功,失败
从 twisted.internet.error 导入 ConnectionRefusedError

我的对象类:
    def成功(自我):
        返回成功(真)

    def失败(自我):
        返回失败(ConnectionRefusedError())


类TestErrBack(TestCase):
    默认设置(自我):
        self.o = MyObject()

    @inlineCallbacks
    def test_success(self):
        结果 = 产生 self.o.success()
        self.assertTrue(结果)

    @inlineCallbacks
    def test_failure(self):
        # 这个测试用例失败了!
        产生 self.assertRaises(ConnectionRefusedError, self.o.failure)

我在 test_failure 中使用了正确的方法吗?我可以使用 try...catch 来调用 self.o.failure,但我认为这种方法不如使用 assertRaises 好。

4

1 回答 1

14

改用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引发测试失败异常而不是返回失败。

这将适用于您的示例代码,并且应该适用于大多数单元测试。如果您正在使用 Trial 编写功能或集成测试,其中正在进行实际的异步工作并且您不知道何时Deferred触发,那么您需要坚持使用第一个 API assertFailure,.

于 2012-03-23T20:15:24.137 回答