测试 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的主要内容,如果未能解决你的问题,请参考以下文章

测试2

测试asd

测试tinymce5

text

测试一下测试一下测试一下测试一下

测试使用