2010-12-10 2 views
5

Dies ist nur eine Theorie, die ich basierend auf anderen Feedback und vielleicht ähnlichen Erfahrungen herausfinden möchte.Django SQLite testet Kuriosität: Unterschiedlicher Ausführungsweg?

Verwendung von mySQL zum Ausführen von Tests, aber natürlich ist eine In-Memory-SQLite-Datenbank viel schneller. Es scheint jedoch einige Probleme gegeben zu haben.

Wenn DATABASE_ENGINE gesetzt django.db.backends.sqlite3 zu verwenden und ich laufe manage.py test wird der Ausgang nicht wie erhofft:

(entfernt die meisten Linien, aber interessante Punkte des Scheiterns den Hinweis auf)

 
$ python manage.py test 
Traceback (most recent call last): 
    File "manage.py", line 12, in 
    execute_manager(settings) 
    File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in 
    class AcvTripIncentive(models.Model): 

    # First interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive 
    trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) 

    # Next interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in 
    current_site = Site.objects.get_current() 

es mehrere sind Misserfolge wie das, aber nur ein paar hinweisen. Das Problem ist offensichtlich. Das Standortmodell enthält keine tatsächlichen Daten, aber die Dateien enthalten Code, der versucht, die aktuellen oder bestimmte Instanzen unter dem Standortmodell abzurufen.

Jetzt kann ich eine einfache Lösung denken: Das OneToOneField sollte umgeschaltet werden, um eine Funktion mit limit_choices_to zu verwenden, und die zweite gleich. Die Funktionen werden dann bei Bedarf aufgerufen, nicht beim ersten Scannen der Datei durch Django.

Meine eigentliche Frage ist jedoch: Warum passiert das mit SQLite und nicht mySQL?. Gibt es einen anderen Weg, den die beiden Datenbank-Engines durch Tests durchlaufen? Ich würde es nicht glauben, da Python das ganze kompilieren der Modelle macht.

Was genau passiert hier?

Prost.

+0

Haben Sie bedenken, dass die sqlite-Datenbank bei jeder Ausführung der Tests neu erstellt und leer ist, während die mysql-Datenbank die gleiche ist, die Sie für Produktion/Entwicklung verwenden und bereits mehr Daten enthält? –

+0

Die mySQL-Datenbank wird jedes Mal neu erstellt. – Bartek

+0

Wo rufen Sie Site.objects.get_current() in Ihrem Modell auf? Ist es in der save() - Methode oder in einem Signal? –

Antwort

0

Laden Sie Ihre Site-Objekte von einem Fixture?

Wenn ja, stolpern Sie vielleicht über ein bekanntes Problem mit MySQL und Transaktionen. Suchen Sie eine Textsuche für "MySQL und Fixtures" auf dieser Seite: http://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs

+0

Verwendet keine Fixtures für das Site-Objekt und das Problem besteht nur bei SQLite :( – Bartek

1

Gibt es einen Grund, warum Sie nicht mocking Zugriff auf die Datenbank sind? Ihre UT-Grenze wird enorm groß, wenn Sie der Mischung eine Datenbank hinzufügen (egal welche Datenbank). Es sieht mehr wie ein Integrationstest als ein Komponententest aus.