2014-10-30 10 views
20

Sono relativamente nuovo a Python e voglio usare un test assertRaises per verificare un ValidationError, che funziona bene. Tuttavia, ho molti ValidationError e voglio assicurarmi che venga restituito quello giusto. Ho pensato di poter passare qualcosa in assertRaises ma non sembra possibile, quindi ho pensato di fare solo un assertTrue e controllare il messaggio di eccezione. Tuttavia, non so come accedervi. Questo è anche un buon modo per affrontare questo problema? Grazie.Asser Django/PythonRispondi al controllo dei messaggi

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")) 

risposta

23

È possibile utilizzare solo assertRaisesRegexp.

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

Quando lo si utilizza come un contesto manager secondo argomento è un'espressione regolare per la ricerca in rappresentazione di stringa del eccezione.

+0

Ottima risposta, grazie. :) – Teekin

3

Al giorno d'oggi è possibile utilizzare assertRaises come a context manager. In questo modo è possibile acquisire l'eccezione e ispezionarla in un secondo momento.

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

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

mi ha dato il seguente errore: L'oggetto '_AssertRaisesContext' non ha attributo 'messaggio' – ems

4

Poiché la questione è legata alla Django, si potrebbe anche utilizzare il gestore assertRaisesMessage contesto quando eredita da TestCase di Django.

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() 

Nota: Il assertRaisesMessage direttore fa un 'in' di ricerca sul messaggio eccezioni. Quindi, se la tua eccezione genera "Il mio messaggio personalizzato!" si potrebbe anche affermare per "messaggio personalizzato". Tieni questo a mente nel caso in cui tu abbia definito più eccezioni restituendo messaggi simili (ad esempio il test precedente potrebbe anche passare con un messaggio come "Il mio messaggio personalizzato! E qui ci sono ulteriori dettagli." che potrebbe non essere il risultato desiderato) .