2016-09-23 6 views
2

Ich habe kürzlich eine wiederverwendbare App innerhalb des Django-Projekts, an dem ich arbeite, implementiert. Für die Frage, nennen wir es reusable_app. Diese App hat auch einige Unittests, die ausgeführt werden, jedoch hängen diese Tests von einigen Basismodellen ab, die irgendwo neben den Tests in einer model.py deklariert sind.Django Single-Test-Migration

/resuable_app 
    __init__.py 
    models.py 
    views.py 
    urls.py 
    /tests 
     __init__.py 
     tests.py 
     /simple_app 
      __init__.py 
      models.py 

Nun werden die Modelle sind nicht in die Datenbank geladen, wenn ich den Ordner, in INSTALLED_APPS in der Testkonfigurationsdatei angeben. Ich habe mich gefragt, ob es eine andere Möglichkeit gibt, dies zu erreichen, und die App nicht in der Einstellungsdatei verfügbar machen muss? Ich scheine in der Lage zu sein, die App über @override_settings anzugeben, aber die Migrationen werden nicht ausgeführt.

Ex:

@override_settings(INSTALLED_APPS=['reusable_app']) 
class TestReusableApp(TestCase): 
def test_something(self): 
    ... 

Wenn reusable_app nicht im Einstellungsmodul INSTALLED_APPS angegeben ergibt dies immer noch ein ProgrammingError. Fehle ich etwas oder gibt es einen anderen Ansatz?

Antwort

2

Ich denke, das Problem hier ist, dass der Test-Runner die Tabellen vor einrichten Sie die App mit @override_settings hinzufügen.

Normalerweise verwende ich wiederverwendbare Apps, um die Tests im Kontext einer "Beispiel" -App auszuführen, mit Einstellungen, die die App enthalten, die Sie testen möchten. Normalerweise funktioniert das ziemlich gut, da ich die wiederverwendbare App separat verpacke. Hier ist ein example von diesem aus einem früheren Projekt von mir.

Wenn dies jedoch nicht möglich ist, versuchen Sie möglicherweise, setUp in Ihren Tests zu überschreiben, und rufen Sie den Befehl "migrate" innerhalb dieses Codes auf. Zum Beispiel:

from django.core.management import call_command 

@override_settings(INSTALLED_APPS=['reusable_app']) 
MyTestCase(TestCase): 
    def setUp(self): 
     call_command('migrate', 'reusable_app') 

Dies ist ein bisschen chaotisch, aber es könnte einen Versuch wert sein. Abhängig davon, wie die Dinge laufen, müssen Sie möglicherweise auch django.setup() ausführen.

Verwandte Themen