Python 中的 self.assertRaises
我有一段小代码,如下所示,请帮我看看怎么写才正确。我想检查一下ID是否在value
里面,如果没有的话就抛出一个异常。
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
with self.assertRaises(IndexError, value[0]["ID"]):
print "not an error"
2 个回答
1
如果你不一定要使用 assertRaises
这个方法的话,我更倾向于选择 assertIn
:
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
self.assertIn('ID', value)
5
你代码的问题在于 value[0]["ID"]
只是一个随便的参数,而在Python中,参数是在调用函数之前就被计算的。所以在你的情况下,assertRaises
根本没有机会去捕捉错误,因为它根本没有被调用。
如果你想继续使用基于上下文管理器的方法,这种方法在需要同时评估多个表达式时很有用,下面是你可能需要的代码片段:
with self.assertRaises(IndexError):
value[0]["ID"]
或者你可以这样做,如果你只需要解决单个表达式(在lambda中语句是无法工作的):
self.assertRaises(IndexError, lambda: value[0]["ID"])
想了解更多信息,可以看看 这个问题,它似乎解决了你关于如何正确使用 assertRaises
的问题。
另外请注意,在你的情况下,value
只是一个字典,而不是元组,尽管有括号——如果想让 value
成为一个单元素元组,可以使用 foo = (bar, )
这种写法——后面的逗号是为了区分优先级覆盖的括号,比如在 (2 + 2) * 3
中。
在单元测试中,通常不需要输出任何与断言状态相关的内容——无论是通过还是失败,都是单元测试框架的工作来生成适当的报告。但如果你还是想打印出来,只需在你的断言后面加上 print()
——因为如果断言失败,测试会停止运行,控制权不会到达你的 print()
。