Тестирование для KeyError

Я пытаюсь написать единичный тест, который проверяет, что KeyError создается, когда плохой ключ передается в словарь.

Код, вызывающий исключение:

 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 

Я посмотрел и нашел тесты KeyError с использованием лямбда, но мне не повезло. Вот тест, который у меня есть до сих пор, но это ошибки с фактическим 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]) 

assertRaises() вызовет функцию для вас и утвердит, что этот вызов вызывает исключение:

 records = [1, 2] connector = DataConnector("BadConnection") self.assertRaises(KeyError, connector.generate_data, self.table, records) 

В качестве альтернативы, используйте assertRaises() в качестве менеджера контекста:

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

который имеет дополнительное преимущество, что контекстный менеджер затем позволяет вам получить доступ к поднятому исключению:

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

self.assertRaise() принимает только вызываемый, поэтому while

self.assertRaises(KeyError, given_result[:1])
даст вам фактический KeyError во время тестирования,

self.assertRaises(KeyError, lambda: given_result[:1])
должно сработать.

В целом:
Не работает: self.assertRaises(KeyError, mydict[mykey]) #KeyError в тестах
self.assertRaises(KeyError, lambda: mydict[mykey]) ли: self.assertRaises(KeyError, lambda: mydict[mykey])
self.assertRaises(KeyError, mydict.__getitem__, mykey) ли: self.assertRaises(KeyError, mydict.__getitem__, mykey) #, но для этого требуется фактический dict, а не функция