我正在尝试运行此测试:self.assertRaises(AttributeError, branch[0].childrennodes)
,并且branch[0
没有属性childrennodes
,因此它应该抛出AttributeError
,而assertRaises
应该捕获该属性,但是当我运行测试时,测试失败,因为它正在抛出AttributeError
。
Traceback (most recent call last):
File "/home/tttt/../tttt/tests.py", line 504, in test_get_categories_branch
self.assertRaises(AttributeError, branch[0].children_nodes)
AttributeError: 'Category' object has no attribute 'children_nodes'
有什么想法吗?
我认为这是因为断言只接受一个可调用的。它评估可调用函数是否引发异常,而不是语句本身是否引发异常。
应该有用。
编辑:
正如THC4k正确地说,它在收集时收集语句,然后会出错,而不是在测试时。
这也是我喜欢nose的一个原因,它有一个decorator(raises),对于这类测试来说非常有用和清晰。
pytest也有一个类似的decorator:
当测试运行时,在调用self.assertRaises之前,Python需要找到所有方法参数的值。在这样做的时候,它计算
branch[0].children_nodes
,这会引发AttributeError。由于我们尚未调用assertRaises,因此未捕获此异常,从而导致测试失败。解决方法是将
branch[0].children_nodes
包装在函数或lambda中:assertraise也可以用作上下文管理器(自Python 2.7以来,或在PyPI包“unittest2”中):
这很好,因为它可以在测试过程中用于任意代码块,而不必创建一个新函数来定义它所应用的代码块。
如果需要,它可以让您访问引发的异常以进行进一步处理:
相关问题 更多 >
编程相关推荐