我正在做Python Koans(在Python 2上)并在about_classes
部分有点迷失。
这是我不知道该做什么/发生了什么的代码:
class Dog5(object):
def __init__(self, initial_name):
self._name = initial_name
@property
def name(self):
return self._name
def test_args_must_match_init(self):
self.assertRaises(___, self.Dog5) # Evaluates self.Dog5()
我理解为什么我在这里得到一个错误,因为这个类需要一个参数(并且给出了零)但是在这里没有得到预期的响应。
所以寻找一个解决方案,我找到了这个代码:
def test_args_must_match_init(self):
with self.assertRaises(TypeError):
self.Dog5()
但我不明白。
现在问题是: 最后一段代码在做什么?
with assertRaises(TypeError): Dog5()
在做什么?
答案 0 :(得分:3)
声称调用不带参数的Dog5()
将会引发TypeError
,这将会成功,而不是AssertionError
。
assertRaises()
上的文档非常简单:
assertRaises(exception, msg=None)
测试在使用任何也传递给
assertRaises()
的位置或关键字参数调用callable时引发异常。 如果引发异常,则测试通过,如果引发另一个异常则为错误;如果没有引发异常则失败。 要捕获任何一组异常,一个元组包含异常类可以作为异常传递。
(强调我的)
传递exception
作为TypeError
并且可选msg
创建了Context Manager而不是进一步记录的函数:
如果只给出异常和可能的msg参数,则返回一个上下文管理器,以便测试中的代码可以内联而不是函数编写。
它比它看起来更简单。
答案 1 :(得分:1)
来自docs:
assertRaises(例外,可调用,* args,** kwds)
<强> assertRaises(例外) 强>
测试在使用任何也传递给assertRaises()的位置或关键字参数调用callable时引发异常。如果引发异常则测试通过,如果引发另一个异常则为错误,如果没有引发异常则失败。要捕获任何一组异常,可以将包含异常类的元组作为异常传递。
因此,with assertRaises(TypeError): Dog5()
断言self.Dog5()
提出TypeError
。
Python 2.7引入了使用assertRaises
作为上下文管理器(因此使用with
)的可能性,而在之前的python版本中,您将调用self.assertRaises(TypeError, self.Dog5)