2012-03-23 16 views
10

Bir istisna ortaya çıkarılan bir deneme sınaması nasıl yazılacağını anlamaya çalışıyorum.inlineCallbacks kullanarak deneme sürümünde assertRaises nasıl kullanılır

Şu anda test etmek için 2 basit yönteme sahibim (başarı ve başarısızlık). Her bir yöntem, daha önce geri arama veya errback olmuş bir ertelenmiş değeri döndürür. Başarı yöntemini test etmek iyi çalışıyor. Hata yöntemini test ederken bir istisnanın ortaya çıktığını (assertRaises kullanarak) ileri sürmeyi beklerim.

test durumu başarısız olur ve ben olsun Ancak:

 
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) 

ben test_failure doğru bir yaklaşım kullanıyor muyum şu şekildedir:

 
twisted.trial.unittest.FailTest: ConnectionRefusedError not raised (<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> returned) 

kodudur? Denemeyi kullanabilirim ... çağrıyı self.o.failure'a yakalamak, ama bu yaklaşımın assertRaises'i kullanmak kadar iyi olduğunu sanmıyorum. yerine

cevap

13

Kullanım TestCase.assertFailure:

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

Ve bu API ek bir argüman alır ve sizin için tür denetimi gerçekleştirir 13.1 başlayan:

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

Twisted 12.3 başlayarak, aynı zamanda bir TestCase.failureResultOf yardımcı vardır:

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

Biz bu 'un'u bildiği testler için eful, Deferred zaten bir sonuçla tetikledi. Deferred'un arama sırasında bir başarısızlık sonucu yoksa, failureResultOf, hatayı döndürmek yerine sınama başarısız bir özel durumu yükseltir.

Örnek kodunuz için iyi çalışır ve çoğu birim sınaması için geçerli olmalıdır. Eğer gerçek zaman uyumsuz çalışmanın devam ettiği ve Deferred'un ne zaman ateş edeceğini bilemezseniz, işlevsel veya entegrasyon testleri yazmak için deneme kullanıyorsanız, o zaman ilk API, assertFailure ile uymanız gerekir.

+1

Teşekkürler, tam da aradığım şey buydu! –

İlgili konular