2014-06-20 20 views
7

Próbuję napisać test jednostkowy, który weryfikuje, że KeyError jest tworzony, gdy zły klucz jest przekazywany do słownika.Testowanie KeyError

Kod, który podnosi wyjątek:

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 

szukałem i znalazłem KeyError testy przy użyciu lambda, ale ja nie miałem dużo szczęścia. Oto test, jaki do tej pory miałem, ale błędy w stosunku do rzeczywistego 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]) 

Odpowiedz

9

assertRaises() będzie wywołanie funkcji dla Ciebie, i twierdzą, że to wezwanie podnosi wyjątek:

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

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

Alternatywnie, użyj assertRaises() jako kierownik kontekstu:

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

który ma dodatkową zaletę, że menedżer kontekstu pozwala uzyskać dostęp do wyjątku:

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

Dziękuję - to wyjaśnia to idealnie! Z jakiegoś powodu nie mogłem użyć "raises.exception.msg", zamiast tego użyłem "raises.exception [0]", co dało mi oczekiwany rezultat. – OpenDataAlex

+1

@OpenDataAlex: przepraszam; wartość 'exception.args [0]' jest również widoczna jako 'exception.message'; Właśnie błędnie to napisałem. –

+0

Fajna fasola - zadziałała jak urok :) – OpenDataAlex

3

self.assertRaise() zajmie tylko wymagalne, więc podczas

self.assertRaises(KeyError, given_result[:1])
nie daje rzeczywisty KeyError podczas testowania

self.assertRaises(KeyError, lambda: given_result[:1])
powinno działać.

Ogólnie:
nie działa: self.assertRaises(KeyError, mydict[mykey]) #KeyError w testach
działa: self.assertRaises(KeyError, lambda: mydict[mykey])
działa: self.assertRaises(KeyError, mydict.__getitem__, mykey) #but to wymaga rzeczywistej dict, zamiast funkcji