2014-10-30 16 views
20

numaralı ileti onayına sahiptir. Python'da göreceli olarak yeniyim ve ValidationError numaralı telefonu incelemek için assertRaises testini kullanmak istiyorum. Ancak, birçok ValidationError s var ve doğru olanın döndüğünden emin olmak istiyorum. assertRaises'a bir şey iletebileceğimi düşündüm ama yapamadım gibi görünmüyor, bu yüzden bir assertTrue yapıp istisna mesajını kontrol etmeyi düşündüm. Ancak, nasıl erişeceğimi bilmiyorum. Bu konuya yaklaşmanın iyi bir yolu bile mi? Teşekkürler.Django/Python assert

class DailyEntriesTests(TestCase): 
def test_cant_have_ip_and_user(self): 
    u = createUser(False) 
    de = createDailyEntry(u, "1.1.1.1", 1) 
    with self.assertRaises(ValidationError) as cm: 
     de.full_clean() 

    # this line bombs - message doesn't exist. I also tried "error_code" like I saw in the documentation, but that doesn't work 
    print(cm.exception.message) 

    self.assertTrue(cm.exception.message.contains("Both")) 

cevap

23

assertRaisesRegexp'u kullanabilirsiniz. Bir bağlam yöneticisi olarak kullandığınızda

with self.assertRaisesRegexp(ValidationError, "Both"): 
    de.full_clean() 

2 argüman ise istisnanın dize temsil yoluyla aramak için düzenli ifadedir.

+0

Harika cevap, teşekkürler. :) – Teekin

3

Günümüzde assertRaises'u a context manager olarak kullanabilirsiniz. Bu şekilde istisnayı yakalayabilir ve daha sonra inceleyebilirsiniz. sorusu Django'ya ilgili olduğundan Django'nın TestCase devralma

with self.assertRaises(SomeException) as cm: 
    do_something() 

the_exception = cm.exception 
self.assertEqual(the_exception.error_code, 3) 
+3

bu bana şu hatayı verdi: '_AssertRaisesContext' nesnesinin 'message' niteliği yok – ems

4

, ayrıca assertRaisesMessage bağlam yöneticisini kullanabilirsiniz.

from django.test import TestCase 

class ExceptionTest(TestCase): 

    def test_call_raises_exception_with_custom_message(self): 
     with self.assertRaisesMessage(Exception, 'My custom message!'): 
      call_that_causes_exception() 


Not:assertRaisesMessage yöneticisi istisnalar iletide bir 'içinde' sorgusu yapar. Eğer istisnanız "Özel mesajım!" bile "özel mesaj" için iddia edebilirsiniz. Benzer iletileri döndüren çoklu istisnalar tanımlamanız durumunda bunu aklınızda bulundurun (örneğin yukarıdaki test gibi bir iletiyle de iletecektir. Özel mesajım! Ve burada daha fazla ayrıntı var. " İstenilen sonuç olmayabilir) .

İlgili konular