Как в модульном тесте можно определить параметр, переданный в пользовательское исключение? - PullRequest
4 голосов
/ 01 июня 2011
class AppError(Exception): pass

class MissingInputError(AppError):

    em = {1101: "Date input is missing. Please verify.", \
          1102: "Key input is missing. Please verify.", \
          1103: "Stn input is missing. Please verify."}
          # and so on ...

...

def validate(self):
    """ Method of Input class to validate input and save it """

    params = self.__params

    if 'dt' in params:
        self.__validateKey(escape(params['dt'][0]))
    else:
        raise MissingInputError(1101)

    if 'key' in params:
        self.__validateService(escape(params['key'][0]))
    else:
        raise MissingInputError(1102)

    # and so on ...

Модульное тестирование выше, я знаю, что следующие тесты в классе тестирования MissingInput:

def testMissingKeyInput(self):
    """ Missing key should raise error """
    ip = controller.Input(MissingInput.missInputKey)
    self.assertRaises(errors.MissingInputError, ip.validate)

def testMissingDtInput(self):
    """ Missing dt should raise error """
    ip = controller.Input(MissingInput.missInputDt)
    self.assertRaises(errors.MissingInputError, ip.validate)

# and so on ...

будет правильно определять, если MissingInputErrorисключение было поднято.

Есть ли способ определить в тесте, какой номер ошибки был передан исключению при его вызове, чтобы я мог быть уверен, что ошибка возникает для этого конкретного отсутствующего ввода, а не для любого другогопропущенные входы?

(PS: Python 2.4.3 ).


Совет : Если вы застряли с 2,4 до 2,6, использовать библиотеку unittest2 .В Python 2.7 и 3.2 появится целый ряд улучшений для unittest.unittest2 - это бэкпорт новых функций (и тестов) для работы с Python 2.4, 2.5 и 2.6.

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Вы можете передать регулярное выражение, которое работает с сообщением:

import unittest

class MyError(Exception):
    pass

def raiseError():
    raise MyError(100)

class TestStuff(unittest.TestCase):
    def testError(self):
        self.assertRaisesRegexp(MyError, '100', raiseError)

unittest.main()    

Это имеет для вас смысл? Если бы вы вызывали MyError ('foo') или MyError (101), тест завершился бы неудачей, поскольку они не соответствовали бы регулярному выражению '100'. К счастью, этот метод будет работать с числами и всем, что вы можете привести к строке.

См. Документацию unittest для получения подробной информации о assertRaisesRegexp.

В качестве альтернативы, если вы используете Python 2.6 или старше, assertRaisesRegexp не существует, и вам придется сделать что-то вроде этого:

try:
    <code>
except MyError, message:
    self.failUnlessEqual(message.args, <expected args>)
else:
    self.fail('MyError not raised')
2 голосов
/ 01 июня 2011

Параметры находятся в атрибуте args:

>>> class CustomException(Exception):
...     pass
... 
>>> e = CustomException(42)
>>> e.args
(42,)

Держу пари, что доступно и для Python 2.4 .

НТН

Редактировать : поскольку модульные тесты - это обычный код, в нем также можно использовать аргумент args:

>>> import unittest
>>> class Test(unittest.TestCase):
...     def testA(self):
...         try:
...             raise CustomException(42)
...         except CustomException, e:
...             self.assertEquals(e.args[0], 42)
... 
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...