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

#python #exception-handling #sqlalchemy #python-unittest #assertraises

#python #исключение #sqlalchemy #python-unittest #assertraises

Вопрос:

Я пытаюсь модульно протестировать свой код 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 работает иначе, чем я ожидаю от этого?

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

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

Комментарии:

1. Удалите try/except блок в add_user методе. Затем вы должны увидеть ошибку. Или просто удалите session.rollback вызов.

2. удаление try / except вызывает ошибку, но все равно тест не пройден, но разве assertRaises не предназначены для прохождения теста, если возникает исключение?

3. Проверьте ответ Кэти Ван Стоун…

Ответ №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
  

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