python unittest assertRaises выдает исключение при сбое assertRaises - PullRequest
6 голосов
/ 05 августа 2009

У меня есть код, где assertRaises выдает исключение при сбое assertRaises. Я думал, что если assertRaises не пройден, то тест не пройден, и в конце я получу отчет о том, что тест не пройден. Я не ожидал, что будет брошено исключение. Ниже мой код. Я что-то не так делаю? Я использую Python 2.6.2.

import unittest

class myClass:

    def getName(self):

        raise myExcOne, "my exception one"
        #raise myExcTwo, "my exception two"
        #return "a"

class myExcOne(Exception):
    "exception one"

class myExcTwo(Exception):
    "exception two"


class test_myClass(unittest.TestCase):

    def setUp(self):

        self.myClass = myClass()

    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        #self.assertRaises(myExcTwo,self.myClass.getName)

        try:
            self.assertRaises(myExcTwo,self.myClass.getName)
        except Exception as e:
            pass

if __name__ == "__main__":

    #unittest.main()

    suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass)
    unittest.TextTestRunner(verbosity=2).run(suite)

Ответы [ 2 ]

6 голосов
/ 05 августа 2009

Начиная со стороны, () после имени класса в выражении class совершенно правильно в современном Python - совсем не ошибка.

По сути проблемы, assertRaises(MyException, foo) задокументировано для распространения исключений, вызванных вызовом foo(), чей тип НЕ является подклассом MyException - это только ловит MyException и его подклассы. Когда ваш код вызывает исключение одного типа, а ваш тест ожидает другого типа, не связанного с этим, возникшее исключение будет распространяться в соответствии с документами модуля unittest, здесь , и я цитирую:

Тест проходит, если исключение , возникает ошибка, если возникает другое исключение, или не выполняется, если исключение не возникает.

И «является ошибкой» означает «распространяет другое исключение».

Когда вы ловите исключение, распространяющееся в вашем блоке try / Кроме того, вы обнуляете ошибку, и unittest ничего не остается для диагностики. Если ваша цель - превратить эту ошибку в сбой (дискуссионная стратегия ...), ваш блок except должен вызвать self.fail.

6 голосов
/ 05 августа 2009

Неверный код Для начала class myClass(): должно быть class myClass:. Также if name == "main": должно быть:

if __name__ == "__main__":
    unittest.main()

Помимо этих проблем, это дает сбой, потому что getName() вызывает исключение myExcOne и ваш тест ожидает исключение myExcTwo.

Вот код, который работает. Пожалуйста, измените код в вашем вопросе, чтобы нам было легко вырезать и вставить его в сеанс Python:

import unittest

class myExcOne(Exception): "exception one"

class myExcTwo(Exception): "exception two"

class myClass:
    def getName(self):
        raise myExcTwo

class test_myClass(unittest.TestCase):
    def setUp(self):
        self.myClass = myClass()
    def testgetNameEmpty(self):
        #self.assertRaises(myExcOne,self.myClass.getName)
        self.assertRaises(myExcTwo,self.myClass.getName)

if __name__ == "__main__":
    unittest.main()
...