关于python:如何在使用inlineCallbacks的试验测试用例中使用assertRaises

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。


TestCase.assertFailure代替:

1
yield self.assertFailure(self.o.failure(), ConnectionRefusedError)

从Twisted 12.3开始,还有一个TestCase.failureResultOf助手:

1
self.failureResultOf(self.o.failure()).trap(ConnectionRefusedError)

从13.1开始,这个API接受一个额外的参数,并为您执行类型检查:

1
self.failureResultOf(self.o.failure(), ConnectionRefusedError)

这对于您知道Deferred已经触发结果的测试很有用。如果调用时Deferred没有失败结果,failureResultOf将引发测试失败异常,而不是返回失败。

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