测试 KeyError
Posted
技术标签:
【中文标题】测试 KeyError【英文标题】:Testing for KeyError 【发布时间】:2014-08-11 09:51:22 【问题描述】:我正在尝试编写一个单元测试,以验证在将错误键传递给字典时创建了 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
我已经查看并找到了使用 lambda 的 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])
【问题讨论】:
【参考方案1】: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 需要一个实际的 dict,而不是函数
【讨论】:
这个答案比公认的答案更容易理解和推理,因为它提供了更通用的解决方案而不是自定义解决方案。谢谢!self.assertRaises(KeyError, mydict.get(mykey))
也可以。【参考方案2】:
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")
【讨论】:
谢谢你 - 这完美地解释了它!出于某种原因,我无法使用“raises.exception.msg”,而是使用了“raises.exception[0]”,这给了我预期的结果。 @OpenDataAlex:对不起;exception.args[0]
值也暴露为 exception.message
;我只是拼错了。以上是关于测试 KeyError的主要内容,如果未能解决你的问题,请参考以下文章