我有一个小代码如下,请帮助我如何以正确的方式编写。我想检查value
中是否存在ID,如果不存在,则会引发异常。
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
with self.assertRaises(IndexError, value[0]["ID"]):
print "not an error"
代码的问题是value[0]["ID"]
只是一个任意参数,在Python中,参数在执行函数调用之前进行求值。所以在您的情况下,assertRaises
没有机会拦截错误,因为它没有被调用。
如果你想坚持基于上下文管理器的方法,我想你正在寻找这个片段,这在你需要同时评估语句或多个表达式的情况下很有用:
with self.assertRaises(IndexError):
value[0]["ID"]
或者,如果您需要解析单个表达式(语句在lambdas中不起作用),也可以使用这种方式:
self.assertRaises(IndexError, lambda: value[0]["ID"])
有关这方面的更多信息,请看一下这个问题,因为它似乎解决了您关于如何正确使用assertRaises
的问题。
此外,请注意,在您的情况下,value
只是dict,而不是元组,尽管有括号——为了使value
成为单元素元组,请使用foo = (bar, )
语法——需要尾部昏迷来区分优先级覆盖括号,如(2 + 2) * 3
。
此外,在单元测试中,您通常不需要输出任何与断言状态相关的内容——如果它通过或失败,则由单元测试框架来形成适当的报告。但是,如果您无论如何都愿意打印它,只需在断言之后包含print()
——因为如果断言失败,测试将停止运行,控制将无法到达print()
。
如果您不坚持使用assertRaises
方法,我宁愿选择assertIn
:
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
self.assertIn('ID', value)