Не могу понять результаты при использовании assertRaises в модульном тестировании кода sqlalchemy

Я пытаюсь выполнить модульное тестирование моего кода sqlalchemy.

    def add_user(*user_details):
         try:
             u = User(*user_details)
             session.add(u)
             session.commit()
         except:
             session.rollback()

Теперь в моем модульном тесте:

    def testDuplicate(self):
         add_user(user_detail1,user_detail2)
         self.assertRaises(IntegrityError, add_user(user_detail1,user_detail2))

Этот тест должен завершиться успешно, если вызов функции add_user вызывает ошибку целостности, и завершится неудачно, если исключения нет. Но проблема в том, что тест проходит успешно в обоих случаях.

Почему это происходит? Что-то не так в моем коде? или assertRaises работает не так, как я от него ожидаю?

Сначала я подумал, что это происходит из-за того, что я поместил исключением в своем предложении try, и исключение обрабатывается только там, а assertRaises не получает исключения. Но если бы это было так, то assertRaises должен был бы завершиться ошибкой, если бы не было получено исключение.

Если есть что-то неправильное в написании моего модульного теста, скажите мне, потому что я все еще учусь включать модульное тестирование в свои привычки кодирования.


person codecool    schedule 13.11.2011    source источник
comment
Удалите блок try/except в методе add_user. Тогда вы должны увидеть ошибку. Или просто удалите вызов session.rollback.   -  person rubik    schedule 13.11.2011
comment
удаление try/except вызывает ошибку, но тест все еще не пройден, но разве assertRaises не предназначен для прохождения теста, если возникает исключение?   -  person codecool    schedule 13.11.2011
comment
Проверьте ответ Кэти Ван Стоун...   -  person rubik    schedule 13.11.2011


Ответы (1)


Вы используете assertRaises неправильно, вместо этого вы должны написать:

self.assertRaises(IntegrityError, add_user, user_detail1, user_detail2)

Вы передаете функцию и аргументы отдельно assertRaises, чтобы он мог управлять вызовом функции (например, в блоке try/except в assertRaises).

Другая проблема заключается в том, что тестируемая функция проглатывает ошибку. Пытаться

def add_user(*user_details):
         try:
             u = User(*user_details)
             session.add(u)
             session.commit()
         except:
             session.rollback()
             raise

который повторно вызовет исключение (но позволит откатить транзакцию).

person Kathy Van Stone    schedule 13.11.2011