16

我正在尝试编写一个单元测试来验证 aKeyError是在将坏键传递给字典时创建的。

引发异常的代码:

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了使用 lambda 的测试,但我运气不佳。这是我到目前为止的测试,但它与实际的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])
4

2 回答 2

14

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")
于 2014-06-20T15:29:51.883 回答
14

self.assertRaise()只需要一个可调用的,所以虽然

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, mydict.__getitem__, mykey) #but 需要一个实际的字典,而不是一个函数

于 2016-07-06T07:08:09.760 回答