2010-08-26 15 views
6

Ich teste meine Bewerbung und stoße auf ein Problem und ich bin mir nicht sicher warum. Ich lade Geräte für meine Tests und die Geräte haben Fremdschlüssel, die aufeinander angewiesen sind. Sie müssen in einer bestimmten Reihenfolge geladen werden oder es wird nicht funktionieren.Werden Django-Geräte beim Testen in falscher Reihenfolge geladen?

Die Armaturen I Laden bin, sind:

["test_company_data", "test_rate_index", 'test_rate_description']

Firmendaten die erste ist. test_rate_index hat einen Fremdschlüssel für das Unternehmen und test_rate_description hat einen Fremdschlüssel für ein Modell, das in test_rate_index deklariert ist. (Nebenbei, verschiedene Tests benötigen unterschiedliche Fixtures, weshalb ich nicht einfach alles in einen hineinschiebe)

Wenn ich das Django-Standardverfahren zum Laden von Tests verwende, werden die Tests nicht in der richtigen Reihenfolge geladen.

 
class TestPackages(test.TestCase): 
    fixtures = ["test_company_data", "test_rate_index", "test_rate_description",] 

Ich erhalte die Meldung

DoesNotExist: RateDescription matching query does not exist.

Aber wenn ich in umgekehrter Reihenfolge meiner Armaturen (was keinen Sinn macht) funktioniert es:

fixtures = ["test_rate_description", "test_company_data", "test_rate_index",]

Django's documentation heißt es, dass die Befestigungen in der Reihenfolge laden Sie werden erklärt, aber das scheint nicht der Fall zu sein.

Als Abhilfe können anstelle der Verwendung von Djangos

 call_command('loaddata', *fixtures, **{ 
              'verbosity': 0, 
              'commit': False, 
              'database': 'default' 
             })

Ich verwende eine andere Funktion im Setup-Methode, die die Geräte einer nach dem anderen lädt.

def load_fixtures(fixtures): 
    for fixture in fixtures: 
     call_command('loaddata', fixture, **{ 
              'verbosity': 0, 
              'commit': False, 
              'database': 'default' 
              })

Gibt es etwas, was ich tue, das Verständnis falsch oder gar nicht, dass meine Armaturen verursacht nicht in der richtigen Reihenfolge geladen werden, wenn die Standardmethode zu verwenden versuchen?

+0

Wie können Sie die Modelle Ihrer Geräte anzeigen? –

Antwort

1

Djangos Dokumentation besagt, dass die Fixtures in der Reihenfolge geladen werden, in der sie deklariert sind, aber das scheint nicht der Fall zu sein.

Dies ist sicherlich seltsam. Fixtures werden in der richtigen Reihenfolge geladen, wenn ich eines meiner Projekte getestet habe (Django 1.2.1, Python 2.6.2, Postgresql 8.3.11).

Hier ist, was ich tun würde, um Fehler zu beheben.

DoesNotExist: Die zu RateDescription passende Abfrage existiert nicht.

  1. Erhalten Sie diesen Fehler, wenn eine Halterung geladen oder wenn ein Test ausgeführt wird? Kannst du den Fixture/Code finden, der das anhebt? Erhöhen Sie die Ausführlichkeit, wenn es sein muss.

  2. Können Sie versuchen, einen loaddata Befehl von der Befehlszeile aus zu feuern? Rufen Sie es dreimal auf und übergeben Sie den Namen eines Fixtures für jeden Anruf in der richtigen Reihenfolge. Und sehen Sie, ob die Fixtures geladen werden.

  3. Ich weiß, dass Sie das wahrscheinlich schon getan hätten, aber können Sie sicherstellen, dass das erste und das zweite Gerät keine RateDescription Daten enthalten?

+2

Hallo Manoj, Danke für deine Debugging-Vorschläge. Wenn ich von der Kommandozeile lief, entdeckte ich, dass die Armaturen bombardierten, weil „creation_time“ nicht null sein kann“. Nach dem creation_time zu den Befestigungen Hinzufügen sie scheinen zu laufen, wie ich erwarten würde. Es ist jedoch macht mir immer noch keinen Sinn, warum sie scheinbar in Ordnung, aber nicht in einer anderen Reihenfolge installieren würden.Alle meine Tests bestanden und die Tests beruhen darauf, dass diese Daten da sind. – Aaron