2012-02-27 7 views
15

を使用する:ジャンゴ場合ドキュメントによれば、ティアダウン法

Aテストケースは、一方で、テーブルを切り捨てず、試験の開始時 初期データをリロード。代わりに、それは テストの終了時にロールバックされ、データベースのトランザクションでテスト コードを囲みます。それはまた、テストの 終了時のロールバックがその初期状態にデータベースを復元することを保証するために、任意の発行からテスト対象のコードがデータベースにロールバック操作をコミットまたは 防止します。 すべてのTestCaseコードがクリーン データベースで始まることを保証するには、 の前に、 データベースを変更する可能性のある他のテスト(doctests)の前にDjangoテストランナーがすべてのTestCaseテストを実行します。

私はこのようになりますテストがあればそう:

class GeneralUserCreateTest(TestCase): 

    def setUp(self): 
     create_roletypes() 
     create_permissiontypes() 
     self.client = Client() 
     self.event = create_event() 

    def test_create(self): 
     create_url = reverse('event_user_signup', args=[self.event.slug]) 

     post_data = { 
      'signup-account-email': '[email protected]', 
      'signup-account-password': 'foobar', 
      'signup-account-password2': 'foobar', 
      'signup-account-first_name': 'Foo', 
      'signup-account-last_name': 'Bar', 
     } 
     response = self.client.post(create_url, data=post_data) 
     self.assertEqual(response.status_code, 302) 

     # check creation of user object 
     self.assertEqual(User.objects.filter(email=post_data['signup-account-email']).count(), 1) 
     user = User.objects.get(username=post_data['signup-account-email']) 

     # user and profile objects created 
     self.assertEqual(User.objects.all().count(), 1) 
     self.assertEqual(Profile.objects.all().count(), 1) 

     # get the first user and profile object to test against submitted field 
     user = User.objects.all()[0] 
     profile = Profile.objects.all()[0] 
     role = Role.objects.filter(event=self.event, profiles=profile)[0] 
     self.assertEqual(role.roletype.name, 'General') 
     self.assertEqual(user.username, post_data['signup-account-email']) 
     self.assertEqual(user.email, post_data['signup-account-email']) 
     self.assertEqual(profile.first_name, post_data['signup-account-first_name']) 
     self.assertEqual(profile.last_name, post_data['signup-account-last_name']) 

teardownメソッドを実行することが依然として必要であるかTestCaseクラスはそれの世話をするのでしょうか?もしそうなら、いつteardownメソッドを使うべきですか?TestCaseクラスが利用できるのですか?各テストがトランザクション内で実行されるため、データベースの目的のために

答えて

22

は、tearDownは、かなり無意味です。しかし、テストのすべてがデータベースに関係するわけではありません。あなたは、ファイルの作成/読み取り、プロセスのスピンオフ、ネットワーク接続のオープンなどをテストするかもしれません。これらのタイプのものは通常、完了後にそれらを「閉じる」必要があります。これはtearDownのもので、つまり、データベースに関係なく、setUpメソッドのものをクリーンアップします。 (実際にデータベースに直接接続していた場合、つまり実際のDjangoテストですべてのDBAPIが正常に動作することを確認する必要がある場合など)、

5

MongoDBやRedisのような代替データベースを使用していて、一連の初期データ(「コレクション」)をロードする必要がある場合は、tearDownメソッドもオーバーライドする必要があります。

django.test.TestCaseは各 新しいテストの開始時に、データベースのフルフラッシュを行い、一般的に

http://www.belchak.com/2011/02/07/unit-testing-django-with-a-nosql-backend/を参照してください。つまり、Chris Prattが上記のようにtearDownのオブジェクトを手動で削除する必要はありません。次のテストsetUpは、データベースがきれいであることを確認します。私たちはのdoctestとunittest.TestCaseを使用している場合、テストが再び実行される前に

はしかし、何のデータベースのフラッシュはありません。テストの開始時に、データベースは以前の テストの状態になります。これは、以前の実行によって残った漂遊データが競合を引き起こすことを意味します。だから、私たちがdjangoテストのためにdoctestsやunittest.TestCaseを使っているなら、クリーンアップは良い方法かもしれません。

最後に、より複雑なシナリオでは、それはまた、意図的に特定のユニットテストのバグを追い詰めるためにテスト・データベースを保持しても意味があります。

8

私はいくつかのファイルのアップロードを処理するプロジェクトに取り組んでいました。テストで作成されたファイルを削除する必要がありました。その場合、tearDownメソッドは非常に便利でした。

import shutil 

#.... 
#.... 

    def tearDown(self): 
     shutil.rmtree(settings.UPLOAD_ROOT) 
関連する問題