Can somebody please explain to me how to properly test Postgres DB errors, particularly IntegrityError. For example i have next test:
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)
Here it catches the IntegrityError but then all operations will fail, because that's how postgres works, ok. I see in docs that i can use transaction.rollback() but where: in test or in save() method?
Also, i don't like the idea of writing rollbacks by hand, why can't django just try to save, and if it fails - give me IntegrityError and let me continue to work.
I'm using django 1.1
Don't alter the save() method, since you want it to propagate through under normal operations. You should catch the exception in your Test class and rollback there (note that since you're testing transactions you must subclass TransactionalTestCase instead of the normal TestCase).
not 100% sure that this is valid, but you could do:
def save(self):
transaction.commit()
try:
super(MyModel, self).save()
except IntegrityError:
transaction.rollback()
else:
transaction.commit()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With