Ich möchte einen Komponententest für einen Django-Befehl "manage.py" schreiben, der eine Backend-Operation für eine Datenbanktabelle ausführt. Wie würde ich den Verwaltungsbefehl direkt aus dem Code aufrufen?
Ich möchte den Befehl nicht in der Shell des Betriebssystems von tests.py ausführen, da ich die mit der Datei "manage.py" eingerichtete Testumgebung (Testdatenbank, Test-Dummy-E-Mail-Postausgang usw.) nicht verwenden kann.
quelle
call_command('check')
, um sicherzustellen, dass die Systemprüfungen in einem Test bestanden werden.Anstatt den call_command-Trick auszuführen, können Sie Ihre Aufgabe folgendermaßen ausführen:
quelle
call_command
muss die getestete Anwendung ladenINSTALLED_APPS
. Ich habe mich dafür entschieden, die App nur zu Testzwecken laden zu müssen und diese zu verwenden.call_command
ist wahrscheinlich das, was die meisten Leute zuerst versuchen sollten. Diese Antwort half mir, ein Problem zu umgehen, bei dem ich Unicode-Tabellennamen an deninspectdb
Befehl übergeben musste. Python / Bash interpretierten Befehlszeilenargumente als ASCII, und das bombardierte denget_table_description
Anruf tief in Django.den folgenden Code:
... entspricht den folgenden im Terminal eingegebenen Befehlen:
Siehe Ausführen von Verwaltungsbefehlen aus Django-Dokumenten .
quelle
In der Django-Dokumentation zum Befehl call_command wird nicht erwähnt,
out
dass an umgeleitet werden musssys.stdout
. Der Beispielcode sollte lauten:quelle
Aufbauend auf Nates Antwort habe ich Folgendes:
Verwendung:
Der Vorteil hierbei ist, dass, wenn Sie zusätzliche Optionen und OptParse verwendet haben, dies für Sie erledigt wird. Es ist nicht ganz perfekt - und es werden noch keine Ausgaben weitergeleitet - aber es wird die Testdatenbank verwenden. Sie können dann auf Datenbankeffekte testen.
Ich bin mir sicher, dass die Verwendung des Micheal Foords-Mock-Moduls und die Neuverdrahtung von stdout für die Dauer eines Tests bedeuten würden, dass Sie auch mehr aus dieser Technik herausholen könnten - testen Sie die Ausgabe, die Ausgangsbedingungen usw.
quelle