2014-06-20 12 views
7

Sto provando a scrivere un test unitario che verifica che venga creato uno KeyError quando una chiave errata viene passata a un dizionario.Test per KeyError

Il codice che genera l'eccezione:

connections = SettingsManager().get_connections() 
try: 
    connection = connections[self.conn_name] 
except Exception: 
    self.log.error("Connection %s does not exist, exiting." % conn_name) 
    self.log.error(sys.exc_info()[0]) 
    raise 

ho guardato e ho trovato KeyError test utilizzando lambda, ma non ho avuto molta fortuna. Ecco il test che ho finora, ma errori con l'attuale KeyError.

def test_bad_connection(self): 
    #Testing to see if a non existant connection will fail gracefully. 
    records = [1, 2] 
    given_result = DataConnector("BadConnection").generate_data(self.table, records) 
    expected_result = "BadConnection" 

    self.assertRaises(KeyError, given_result[:1]) 

risposta

9

assertRaises() sarà chiamata la funzione per voi, e affermare che quella chiamata solleva l'eccezione:

records = [1, 2] 
connector = DataConnector("BadConnection") 

self.assertRaises(KeyError, connector.generate_data, self.table, records) 

In alternativa, utilizzare assertRaises() come contesto allenatore:

with self.assertRaises(KeyError) as raises: 
    DataConnector("BadConnection").generate_data(self.table, records) 

che ha il vantaggio aggiunto che il gestore di contesto consente quindi di accedere all'eccezione sollevata:

self.assertEqual(raises.exception.message, "BadConnection") 
+0

Grazie - che spiega perfettamente! Per qualche motivo, non sono stato in grado di utilizzare "raises.exception.msg", piuttosto ho usato "raises.exception [0]" e questo mi ha dato il risultato previsto. – OpenDataAlex

+1

@OpenDataAlex: sorry; anche il valore 'exception.args [0]' è esposto come 'exception.message'; Ho appena scritto male. –

+0

Fagioli freschi - ha funzionato come un fascino :) – OpenDataAlex

3

self.assertRaise() richiede solo un callable, così mentre

self.assertRaises(KeyError, given_result[:1])
si darebbe un vero e proprio KeyError durante il test,

self.assertRaises(KeyError, lambda: given_result[:1])
dovrebbe funzionare.

In generale:
non funziona: self.assertRaises(KeyError, mydict[mykey]) #KeyError nei test
funziona: self.assertRaises(KeyError, lambda: mydict[mykey])
funziona: self.assertRaises(KeyError, mydict.__getitem__, mykey) # ma è richiede un dict vero e proprio, invece di una funzione

Problemi correlati