2009-08-20 4 views
7

누군가 제게 Postgres DB 오류, 특히 IntegrityError를 올바르게 테스트하는 방법을 설명해 주실 수 있습니까? 즉 좋아, 작품을 POSTGRES 방법이기 때문에, 여기에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) 

는 IntegrityError가 잡는다하지만 모든 작업이 실패합니다 : 예를 들어 나는 다음 테스트가 있습니다. 문서에서 transaction.rollback()을 사용할 수 있지만 where : 테스트 또는 save() 메소드에서?

또한 수동으로 롤백을 쓰는 아이디어가 마음에 들지 않습니다. 왜 장고를 저장하려고하면 안되며, 실패 할 경우 IntegrityError를 제공하고 계속 작업하게하십시오.

나는 장고이 유효 있는지 1.1

답변

2

당신이 그것을 원하기 때문에, 저장() 메소드를 변경하지 마십시오 정상적인 작동 하에서 전파된다. Test 클래스에서 예외를 catch하고 거기에서 롤백해야합니다 (트랜잭션을 테스트하기 때문에 일반 TestCase 대신 TransactionalTestCase를 서브 클래스해야 함).

+0

감사합니다. 따라서 라이브 코드에서 IntegrityError를 잡아도 모든 것이 잘 될 것입니까? 아니면 명시 적으로 롤백해야합니까? –

+0

코드에서 IntegrityError가 발생하지 않도록하고 모든 SQL 오류를 버그로 간주해야합니다. 그러므로 수정을 시도하기 전에 확인해야합니다. 수정할 수없는 경우 롤백하여 문제를 사용자에게보고 할 수 있습니다. 또는 수정 사항을 건너 뛰거나 대신 다른 수정을 할 수 있습니다. –

2

100 %를 사용하고 있습니다,하지만 당신은 할 수 :

def save(self): 
    transaction.commit() 
    try: 
     super(MyModel, self).save() 
    except IntegrityError: 
     transaction.rollback() 
    else: 
     transaction.commit() 
+0

감사합니다. 그러나 솔직히 말하면, 이것은 추한 것입니다 :) –