Se si prevede che Thing (name = '1234') per generare un'eccezione, ci sono due modi per risolvere questo problema.
Uno è quello di utilizzare assertRaises di Django (in realtà da unittest/unittest2):
def mytest(self):
self.assertRaises(FooException, Thing, name='1234')
Questo non riesce a meno Thing (name = '1234') solleva un errore di FooException. Un altro modo è quello di catturare l'eccezione prevista e sollevare uno se non accade, in questo modo:
def mytest(self):
try:
thing = Thing(name='1234')
self.fail("your message here")
except FooException:
pass
Ovviamente, sostituire il FooException con quello che ci si aspetta di ottenere da creare l'oggetto con troppo a lungo una corda. Errore di convalida?
Una terza opzione (a partire da Python 2.7) è quello di utilizzare assertRaises come un gestore di contesto, che rende per una maggiore pulizia, il codice più leggibile:
def mytest(self):
with self.assertRaises(FooException):
thing = Thing(name='1234')
Purtroppo, questo non permette di messaggi di errore di test personalizzati , quindi documenta bene i tuoi test. Vedi https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97 per maggiori dettagli.
Io uso assertRaises abbastanza spesso. –
Lo faccio anch'io, ma ci vuole un po 'di tempo per abituarsi alla sintassi. – GDorn
in Python versione 2.6.5, la firma della funzione è diversa. Copiato dal codice Python: 'def failUnlessRaises (self, excClass, callableObj, * args, ** kwargs)' e poi 'callableObj (* args, ** kwargs)'. Quindi, nell'esempio di questo post, sarebbe 'self.assertRaises (FooException, Thing, name = '1234')'. Non sono sicuro del perché la mia firma della funzione sia diversa, ma è quello che funziona. –