Wie können Übersetzungen während Unit Tests in Django deaktiviert werden?

8

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%     
Denilson Sá Maia 31.05.2012, 18:44
quelle

3 Antworten

2

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.

    
Davide 10.01.2016, 06:58
quelle
11

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:

  1. Einstellung der gewünschten Sprache am Sitzungsobjekt.
  2. Einstellung der gewünschten Sprache bei einem Cookie.
  3. Senden von HTTP_ACCEPT_LANGUAGE header.
  4. Einstellung settings.LANGUAGE_CODE

Quelle (aus Django 1.4, aber seit 1.1 oder früher meist unverändert):

Denilson Sá Maia 04.06.2012 16:37
quelle
1
___ answer 10839511 ___

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%     
___ qstntxt ___

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%     
___ tag123django ___ Django ist ein serverseitiges Open-Source-Webanwendungs-Framework, das in Python geschrieben wurde. Es wurde entwickelt, um den Aufwand für die Erstellung komplexer datengesteuerter Websites und Webanwendungen zu reduzieren, mit besonderem Fokus auf weniger Code, keine Redundanz und expliziter als implizit. ___ tag123unittesting ___ Unit Testing ist eine Methode, bei der einzelne Quellcode-Einheiten auf ihre Tauglichkeit getestet werden. ___ answer34702920 ___

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.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer10884827 ___

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:

  1. Einstellung der gewünschten Sprache am Sitzungsobjekt.
  2. Einstellung der gewünschten Sprache bei einem Cookie.
  3. Senden von %code% header.
  4. Einstellung %code%

Quelle (aus Django 1.4, aber seit 1.1 oder früher meist unverändert):

___ qstnhdr ___ Wie können Übersetzungen während Unit Tests in Django deaktiviert werden? ___
Jon Cage 31.05.2012 18:51
quelle

Tags und Links