2010-05-15 2 views
18

나는 나에게 오류를주고 다음 장고 테스트 케이스가 다음을 내 테스트를 실행하면문제는 테스트

class MyTesting(unittest.TestCase): 
    def setUp(self): 
     self.u1 = User.objects.create(username='user1') 
     self.up1 = UserProfile.objects.create(user=self.u1) 

    def testA(self): 
     ... 

    def testB(self): 
     ... 

testA는 성공적으로 통과하지만 testB 시작하기 전에, 나는 수를 오류 :

IntegrityError: column username is not unique 

각 테스트 케이스 전에 self.u1을 만들려고하고 이미 데이터베이스에 있는지 찾는 것이 분명하다. 후속 사례가 올바르게 실행되도록하기 위해 각 테스트 케이스 이후에 어떻게 올바르게 정리할 수 있습니까?

답변

27

setUptearDown unittests의 메소드는 각 테스트 케이스 전후에 호출됩니다. 생성 된 사용자를 삭제하는 방법을 tearDown 정의하십시오.

class MyTesting(unittest.TestCase): 
    def setUp(self): 
     self.u1 = User.objects.create(username='user1') 
     self.up1 = UserProfile.objects.create(user=self.u1) 

    def testA(self): 
     ... 

    def tearDown(self): 
     self.up1.delete() 
     self.u1.delete() 

나는 또한 당신이 정말로 각 사용자에 대해 수동으로 사용자 프로파일을 작성하지 않으려면 post_save 신호를 사용하여 create user profiles를 권합니다. Django docs에서

: 삭제 코멘트에

후속 당신의 프로필을 삭제하려면 먼저 사용자를 삭제해야합니다 귀하의 경우

When Django deletes an object, it emulates the behavior of the SQL constraint ON DELETE CASCADE -- in other words, any objects which had foreign keys pointing at the object to be deleted will be deleted along with it.

는 사용자 프로파일은 사용자가 가리키는 같은 시간.

+0

감사합니다. 내가 지금 가지고있는 문제는 사용자 1을 UserProfile의 외래 키로 지정한 경우에도 up1을 삭제하면 삭제가 계단식으로 삭제되지 않으며 u1도 삭제된다는 것입니다. 예 : ' – theycallmemorty

+0

실제로 사용자를 삭제하여 한 번에 사용자 프로필을 계단식으로 삭제하거나 사용자 프로필을 먼저 삭제 한 다음 사용자를 삭제할 수 있습니다. –

+0

Bah ... 문서에서 읽지는 않았지만 어떤 이유로 외래 키가 가리키는 방향에 대해 혼란 스러웠습니다 ... – theycallmemorty

2

정확하게, setUp은이 각 테스트 케이스 전에 한 번 실행되는 가장 큰 이유는 입니다.

반대의 방법, 각 테스트 케이스 후 한 번 실행 하나, tearDown 이름 : 당신은 그냥 self.u1.delete()를 호출하여 self.u1 등 (아마도 삭제 어디에 당신이뿐만 아니라 보조 전문 청소 요구 사항이 없다면, 그냥 개체 삭제).

8

각 테스트가 실행 된 후 django가 테스트 데이터베이스를 자동으로 플러시하게하려면 django.utils.unittest.TestCase이 아닌 django.test.TestCase을 확장해야합니다 (현재 수행 중임).

각 테스트 후에 데이터베이스를 덤프하는 것이 좋으므로 테스트가 일관적임을 확신 할 수 있지만이 추가 오버 헤드로 테스트가 더 느려질 것입니다.

"Writing Tests" Django Docs경고 섹션을 참조하십시오.