有人可以向我解释如何正确测试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)
这里它捕获IntegrityError但是然后所有操作都会失败,因为这就是postgres的工作方式,好吧。我在docs中看到我可以使用transaction.rollback()但在哪里:在test或save()方法中?
另外,我不喜欢手工编写回滚的想法,为什么django不能尝试保存,如果失败了 - 给我IntegrityError让我继续工作。
我正在使用django 1.1
答案 0 :(得分:2)
不是100%确定这是有效的,但你可以这样做:
def save(self):
transaction.commit()
try:
super(MyModel, self).save()
except IntegrityError:
transaction.rollback()
else:
transaction.commit()
答案 1 :(得分:2)
不要更改save()方法,因为您希望它在正常操作下传播。您应该在Test类中捕获异常并在那里回滚(请注意,因为您正在测试事务,所以必须继承TransactionalTestCase而不是普通的TestCase)。