Czy ktoś może mi wyjaśnić jak poprawnie testować błędy DB PostgreSQL, szczególnie IntegrityError. Na przykład mam kolejny test:django Postgres 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)
Tutaj łapie IntegrityError ale wtedy wszystkie operacje zakończy się niepowodzeniem, ponieważ to jak PostgreSQL prace, ok. Widzę w dokumentach, że mogę używać transakcji transaction.rollback(), ale gdzie: w teście lub w metodzie save()?
Nie podoba mi się również pomysł ręcznego wycofywania zmian, dlaczego django nie może po prostu spróbować zapisać, a jeśli się nie powiedzie - daj mi IntegrityError i pozwól mi kontynuować pracę.
Używam Django 1.1
Ok dzięki. Czy w żywym kodzie wszystko będzie dobrze po złapaniu IntegrityError? Czy powinienem tam nadal wycofywać? –
Powinieneś unikać kiedykolwiek powodując IntegrityError we własnym kodzie i traktować jakikolwiek błąd SQL jako błąd. Powinieneś więc sprawdzić przed próbą modyfikacji, czy ta modyfikacja będzie sensowna. Jeśli okaże się, że modyfikacji nie można wprowadzić, możesz wycofać i zgłosić problem użytkownikowi. Możesz też zrezygnować z modyfikacji lub wprowadzić inną modyfikację. –