Python self.assertRaises

use*_*126 1 python unit-testing assertraises python-unittest

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

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

with self.assertRaises(IndexError, value[0]["ID"]):
    print "not an error"
Run Code Online (Sandbox Code Playgroud)

tor*_*gen 5

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

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

with self.assertRaises(IndexError):
    value[0]["ID"]
Run Code Online (Sandbox Code Playgroud)

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

self.assertRaises(IndexError, lambda: value[0]["ID"])
Run Code Online (Sandbox Code Playgroud)

有关此问题的其他信息,请查看此问题,因为它似乎解决了有关如何正确使用的问题assertRaises.

另请注意,在你的情况下value只是dict,而不是元组,尽管有括号 - 为了制作value单元素元组,使用foo = (bar, )语法 - 需要尾随昏迷来区分优先级覆盖括号,例如(2 + 2) * 3.

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