Ich verwende Django Internationalisierung , um einige Strings aus meiner Anwendung zu übersetzen. Der Code sieht so aus:
%Vor%Dann schreibe ich Unit Tests mit dem Django Test Client . Diese Tests stellen eine Anfrage an die Ansicht und vergleichen die zurückgegebenen Inhalte.
Wie kann ich die Übersetzungen beim Ausführen der Komponententests deaktivieren? Ich strebe das an:
%Vor%Ich habe das gleiche Problem mit Ansatz Nr. 4 aus der Antwort von @Denilson Sá gelöst. Es stellt sich heraus, dass dies keine testspezifische Einstellungsdatei erfordert und kann pro Test mit einem Decorator oder Kontextmanager definiert werden, der von django bereitgestellt wird (siehe überschreibende Einstellungen ).
Es kann so verwendet werden:
%Vor%Der Decorator kann auch auf die gesamte TestCase-Unterklasse angewendet werden, oder für eine noch detailliertere Kontrolle gibt es auch einen Kontextmanager (siehe oben verlinkte Dokumente).
Da dies für mich ziemlich üblich ist, habe ich auch definiert:
%Vor% Damit kann ich jetzt einfach @english
für die Testfälle verwenden, die es erfordern.
Durch Aufruf von .get()
oder .post()
auf dem Test-Client werden alle konfigurierten Middlewares ausgeführt. Das heißt, es wird auch LocaleMiddleware
ausgeführt, was translation.get_language_from_request()
gefolgt von translation.activate(language)
aufruft.
Dies bedeutet, dass die aktuell aktive Sprache ignoriert und weggeworfen wird, wenn Tests mit dem Test-Client geschrieben werden. Mit anderen Worten, der folgende Code funktioniert nicht:
%Vor%Es gibt ein paar Lösungen:
HTTP_ACCEPT_LANGUAGE
header. settings.LANGUAGE_CODE
Quelle (aus Django 1.4, aber seit 1.1 oder früher meist unverändert):
Ich würde denken, dass es mehr Sinn macht, die Sprache nur auf eine bekannte Einstellung für Ihre Komponententests zu zwingen. Das bedeutet, dass Sie etwas testen, das näher an der tatsächlichen Implementierung ist.
Um eine bestimmte Sprache zu aktivieren, können Sie dies in Ihrem Setup tun:
%Vor%Ich verwende Django Internationalisierung , um einige Strings aus meiner Anwendung zu übersetzen. Der Code sieht so aus:
%Vor%Dann schreibe ich Unit Tests mit dem Django Test Client . Diese Tests stellen eine Anfrage an die Ansicht und vergleichen die zurückgegebenen Inhalte.
Wie kann ich die Übersetzungen beim Ausführen der Komponententests deaktivieren? Ich strebe das an:
%Vor%Ich habe das gleiche Problem mit Ansatz Nr. 4 aus der Antwort von @Denilson Sá gelöst. Es stellt sich heraus, dass dies keine testspezifische Einstellungsdatei erfordert und kann pro Test mit einem Decorator oder Kontextmanager definiert werden, der von django bereitgestellt wird (siehe überschreibende Einstellungen ).
Es kann so verwendet werden:
%Vor%Der Decorator kann auch auf die gesamte TestCase-Unterklasse angewendet werden, oder für eine noch detailliertere Kontrolle gibt es auch einen Kontextmanager (siehe oben verlinkte Dokumente).
Da dies für mich ziemlich üblich ist, habe ich auch definiert:
%Vor%Damit kann ich jetzt einfach %code% für die Testfälle verwenden, die es erfordern.
Durch Aufruf von %code% oder %code% auf dem Test-Client werden alle konfigurierten Middlewares ausgeführt. Das heißt, es wird auch %code% ausgeführt, was %code% gefolgt von %code% aufruft.
Dies bedeutet, dass die aktuell aktive Sprache ignoriert und weggeworfen wird, wenn Tests mit dem Test-Client geschrieben werden. Mit anderen Worten, der folgende Code funktioniert nicht:
%Vor%Es gibt ein paar Lösungen:
Quelle (aus Django 1.4, aber seit 1.1 oder früher meist unverändert):
Tags und Links python django unit-testing