1

我有一个如下的小代码,请帮助我如何以正确的方式编写它。我想检查 ID 中是否存在,value如果不存在则引发异常。

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})

with self.assertRaises(IndexError, value[0]["ID"]):
    print "not an error"
4

2 回答 2

5

您的代码的问题在于value[0]["ID"]它只是一个任意参数,并且在 Python 中,参数在执行函数调用之前被评估。所以在你的情况下assertRaises没有机会拦截错误,因为它没有被调用。

我猜你正在寻找这个片段,如果你想坚持使用基于上下文管理器的方法,这在你需要一次评估语​​句或多个表达式的情况下很有用:

with self.assertRaises(IndexError):
    value[0]["ID"]

或者,如果您需要解析单个表达式(语句在 lambdas 中不起作用),您也可以这样工作:

self.assertRaises(IndexError, lambda: value[0]["ID"])

有关这方面的更多信息,请查看这个问题,因为它似乎解决了您关于如何正确使用的问题assertRaises

另外请注意value,尽管有括号,但您的情况只是字典,而不是元组——为了制作value单元素元组,使用foo = (bar, )语法——需要尾随逗号来区分优先级覆盖括号,例如 in (2 + 2) * 3.

同样在单元测试中,您通常不需要输出与断言状态相关的任何内容——如果它通过或失败,单元测试框架的工作就是形成适当的报告。但是,如果您无论如何都愿意打印它,只需print()在您的断言之后包含 - 因为如果断言失败,测试将停止运行,并且控制不会到达您的print().

于 2014-02-26T23:57:39.587 回答
1

如果您不坚持assertRaises方法,我宁愿选择assertIn

value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
self.assertIn('ID', value)
于 2014-02-27T20:33:06.063 回答