2016-05-03 7 views
2

Ich habe Probleme, weg von django_nose.FastFixtureTestCase zu django.test.TestCase (oder sogar die konservativere django.test.TransactionTestCase). Ich benutze Django 1.7.11 und ich teste gerade gegen Postgres 9.2.Django TestCase mit Fixtures verursacht IntegrityError aufgrund von doppelten Schlüsseln

Ich habe eine Testcase Klasse, die drei Fixtures-Dateien lädt. Die Klasse enthält zwei Tests. Wenn ich jeden Test einzeln als einen Lauf ausführe (manage test test_file:TestClass.test_name), funktionieren beide. Wenn ich sie zusammen laufen, (manage test test_file:TestClass), erhalte ich

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" 

Für mich sieht es aus wie der db eigentlich nicht gespült zu werden oder zurück zwischen den Tests gerollt, da es nur passiert, wenn ich die Tests in einem einzigen Durchlauf laufen .

Ich habe durch den Django-Code getreten und es sieht aus wie sie sind gespült zu werden oder zurückgerollt - je nachdem, ob ich TestCase oder TransactionTestCase bin versucht.

(Ich bin weg von FastFixtureTestCase wegen https://github.com/django-nose/django-nose/issues/220)

Was sollte ich bei der Suche werden? Dies scheint so zu sein, als ob es eine einfache Sache sein sollte und ist genau in dem, was django.test.TestCase und Django.test.TransactionTestCase entworfen sind.

Edit:

Die Testklasse mehr oder weniger wie folgt aussieht:

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.            

Update:

Ich habe es geschafft, das ein paar Mal mit einem einzigen Test zu reproduzieren, so Ich vermute etwas im Ladecode der Vorrichtung.

+0

Sind Sie sicher, dass das Feld, das Sie als eindeutig haben, nicht in den Fixtures dupliziert wird? – trinchet

+0

Angesichts der Tatsache, dass die Tests isoliert arbeiten, würde ich sagen, ja, ich bin mir sicher. Sie wurden auch kürzlich aus der Entwicklungsdatenbank dump/created. – rrauenza

+0

Wie laden Sie die Fixtures? Könnten Sie die Testklasse veröffentlichen? – trinchet

Antwort

2

Eine meiner Grundannahmen war, dass meine db für jeden Testfall sauber war. Beim Auffinden des django-Kerncodes habe ich Instanzen gefunden, in denen bereits ein Objekt existiert (in einem Fall django.contrib.auth.User).

Ich überging vorübergehend _Fixture_setup(), um zu bestätigen, dass die db vor dem Laden der Fixtures sauber war. Die Assertion ist fehlgeschlagen.

Ich konnte das Problem auf Code, der in einer TestCase.setUpClass() anstelle von TestCase.setUp() war, eingrenzen, und so das Objekt wurde aus dem Test und Konflikte mit anderen Fixtures TestCase.

Was ich nicht vollständig verstehe, ist, dass ich dachte, dass die db zwischen TestCases gelöscht und neu erstellt wurde - aber vielleicht ist das nicht korrekt.

+0

Ich erlebe das gleiche mit Django 1.9. Ist das nicht ein Fehler? sollte es nicht gemeldet werden? – sazary

+0

Nein, ich denke meine Annahme war einfach falsch. Beachten Sie, dass ich versehentlich ein Objekt in setUpClass() anstelle von setUp() erstellt habe ... also habe ich ein Modellobjekt an der falschen Stelle erstellt. – rrauenza