Ответ 1
"Ошибка" в этом примере может быть любым объектом исключения. Я думаю, что, возможно, вы прочитали пример кода, который использовал его как метасинтетический заполнитель для обозначения "Соответствующий класс исключений".
Базисное слово всех исключений называется "Исключение", и большинство его подклассов представляют собой описательные имена типа ошибки, такие как "OSError", "ValueError" , "NameError", "TypeError".
В этом случае подходящей ошибкой является "ValueError" (значение foo было неправильным, поэтому ValueError). Я бы рекомендовал заменить "Ошибка" на "ValueError" в вашем script.
Вот полная версия кода, который вы пытаетесь написать, я дублирую все, потому что у вас есть странный аргумент ключевого слова в вашем исходном примере, который, кажется, сочетается с назначением, и я использую ' failUnless ', потому что это не сглаженное имя функции:
class MyClass:
def __init__(self, foo):
if foo != 1:
raise ValueError("foo is not equal to 1!")
import unittest
class TestFoo(unittest.TestCase):
def testInsufficientArgs(self):
foo = 0
self.failUnlessRaises(ValueError, MyClass, foo)
if __name__ == '__main__':
unittest.main()
Вывод:
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
Существует ошибка в модульной библиотеке "unittest", которую исправляют в других модулях тестирования модулей. Вы заметите, что невозможно получить доступ к объекту исключения из контекста вызова. Если вы хотите исправить это, вам придется переопределить этот метод в подклассе UnitTest:
Это пример использования:
class TestFoo(unittest.TestCase):
def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
try:
callableObj(*args, **kwargs)
except excClass, excObj:
return excObj # Actually return the exception object
else:
if hasattr(excClass,'__name__'): excName = excClass.__name__
else: excName = str(excClass)
raise self.failureException, "%s not raised" % excName
def testInsufficientArgs(self):
foo = 0
excObj = self.failUnlessRaises(ValueError, MyClass, foo)
self.failUnlessEqual(excObj[0], 'foo is not equal to 1!')
Я скопировал функцию failUnlessRaises из unittest.py из python2.5 и немного изменил ее.