2016-05-03 4 views
2

django_nose.FastFixtureTestCaseからdjango.test.TestCase(またはさらに控えめなdjango.test.TransactionTestCase)に移動するのに問題があります。私はDjango 1.7.11を使用しています。私はPostgres 9.2をテストしています。Django TestCaseでフィクスチャを使用すると、重複したキーのためにIntegrityErrorが発生する

私はTestcaseクラスに3つのフィクスチャファイルをロードしています。クラスには2つのテストが含まれています。個々のテストを個別に1回実行すると(manage test test_file:TestClass.test_name)、それぞれのテストが動作します。私は一緒に、(manage test test_file:TestClass)を実行した場合、私は私に

IntegrityError: Problem installing fixture '<path>/data.json': Could not load <app>.<Model>(pk=1): duplicate key value violates unique constraint "<app_model_field>_49810fc21046d2e2_uniq" 

を取得し、私は単一の実行中にテストを実行すると、それだけ起こるので、DBが実際にフラッシュ取得またはバックテスト間ロールされていないように見えます。

私はDjangoのコードを強化しました、それは彼らあるがフラッシュまたはロールバックばかりのように見える - 私はTestCaseまたはTransactionTestCaseをしようとしているかどうかに応じて。

私が見てしなければならない他に何

FastFixtureTestCasehttps://github.com/django-nose/django-nose/issues/220のため、私は離れてから動いていますか)?これは単純な問題であるように思われ、django.test.TestCaseDjango.test.TransactionTestCaseのために設計されています。

編集:私は、単一のテストでこれを数回を再現するために管理してきました

テストクラスの詳細やこのようにそれほどルックス:

class MyTest(django.test.TransactionTestCase): # or django.test.TestCase       

    fixtures = ['data1.json', 'data2.json', 'data3.json']              

    def test1(self):  
     return # I simplified it to just this for now.        

    def test2(self): 
     return # I simplified it to just this for now.            

を更新私は治具のロードコードで何かを疑う。

+0

あなたが持っているフィールドは、フィクスチャに重複していませんか? – trinchet

+0

テストが孤立しているとすれば、私は確信していると言います。私は確信しています。彼らは最近開発DBからダンプ/作成されています。 – rrauenza

+0

どのように器具をロードしていますか?テストクラスを投稿できますか? – trinchet

答えて

2

私の基本的な前提の1つは、私のdbがすべてのTestCaseできれいだったということでした。 djangoのコアコードをトレースすると、あるオブジェクト(ある場合はdjango.contrib.auth.User)がすでに存在していたインスタンスが見つかりました。

一時的に_fixture_setup()をオーバーライドして、ディメンションをロードする前にdbがクリーンであることをアサートしました。アサーションは失敗しました。

私は、TestCase.setUp()の代わりにTestCase.setUpClass()にあったコードに問題を絞り込むことができ、オブジェクトがテストから漏れて他のTestCaseのフィクスチャと競合していました。

私が完全に理解していないことは、TestCaseの間でdbが削除されて再作成されたと思っていますが、おそらくそれは正しくありません。

+0

私はdjango 1.9と同じことを経験しています。これはバグではありませんか?それは報告されるべきではありませんか? – sazary

+0

いいえ、私の推測は間違っていたと思います。私が誤ってsetUp()の代わりにsetUpClass()でオブジェクトを作成していたので、間違った場所にモデルオブジェクトを作成していました。 – rrauenza

関連する問題