#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
которое повторно вызовет исключение (но позволит выполнить откат транзакции).