与'有什么关系? +' assertRaises'做?

时间:2016-01-19 13:48:55

标签: python

我正在做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()在做什么?

2 个答案:

答案 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)