Не могу понять результаты при использовании assertRaises в модульном тестировании кода sqlalchemy - PullRequest
1 голос
/ 13 ноября 2011

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

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

1 Ответ

3 голосов
/ 13 ноября 2011

Вы используете 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

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

...