2012-03-23 115 views
10

我试图弄清楚如何编写一个试用测试用例来声明异常。如何在试用测试用例中使用assertRaises使用inlineCallbacks

目前我有2个简单的方法来测试(成功和失败)。每种方法都会返回一个已经被callback或者errback的延迟。测试成功方法正常工作。当测试失败方法时,我希望能够断言引发了异常(使用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好。

回答

13

使用TestCase.assertFailure代替:

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

在扭曲的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

+1

谢谢,这就是我一直在寻找的! – 2012-03-23 21:29:59

相关问题