Джанго Постгрес IntegrityError - PullRequest
7 голосов
/ 20 августа 2009

Может кто-нибудь объяснить мне, как правильно тестировать ошибки Postgres DB, особенно IntegrityError. Например, у меня есть следующий тест:

class TestSlugs(TestCase):
    # This slug must be unique
    b = BookPublisher(slug=self.duplicate_slug)
    self.assertRaises(IntegrityError, b.save)

    #check if there's only one BookPublisher
    self.assertEquals(BookPublisher.objects.count(), 1)

Здесь он перехватывает IntegrityError, но тогда все операции завершатся неудачно, потому что именно так работает postgres, хорошо. Я вижу в документах, что я могу использовать транзакцию.rollback (), но где: в тесте или в методе save ()?

Кроме того, мне не нравится идея написания откатов вручную, почему django не может просто попытаться сохранить, а в случае неудачи - дать мне IntegrityError и позволить мне продолжать работать.

Я использую Django 1.1

Ответы [ 2 ]

2 голосов
/ 23 августа 2009

Не изменяйте метод save (), поскольку вы хотите, чтобы он распространялся при обычных операциях. Вы должны перехватить исключение в своем классе Test и выполнить откат (обратите внимание, что, поскольку вы тестируете транзакции, вы должны создать подкласс TransactionalTestCase вместо обычного TestCase).

2 голосов
/ 20 августа 2009

не уверен на 100%, что это действительно, но вы можете сделать:

def save(self):
    transaction.commit()
    try:
        super(MyModel, self).save()
    except IntegrityError:
        transaction.rollback()
    else:
        transaction.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...