Python 中的 self.assertRaises

1 投票
2 回答
5375 浏览
提问于 2025-04-17 20:19

我有一段小代码,如下所示,请帮我看看怎么写才正确。我想检查一下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()

撰写回答