2012-05-31 17 views
8

Estoy usando Django Internationalization herramientas para traducir algunas cadenas de mi aplicación. El código es el siguiente:¿Cómo deshabilitar las traducciones durante las pruebas unitarias en django?

from django.utils.translation import ugettext as _ 
def my_view(request): 
    output = _("Welcome to my site.") 
    return HttpResponse(output) 

Entonces, estoy escribiendo pruebas unitarias utilizando el Django test client. Estas pruebas hacen una solicitud a la vista y comparan los contenidos devueltos.

¿Cómo puedo deshabilitar las traducciones al ejecutar las pruebas unitarias? Estoy con el objetivo de hacer esto:

class FoobarTestCase(unittest.TestCase): 
    def setUp(self): 
     # Do something here to disable the string translation. But what? 
     # I've already tried this, but it didn't work: 
     django.utils.translation.deactivate_all() 
    def testFoobar(self): 
     c = Client() 
     response = c.get("/foobar") 
     # I want to compare to the original string without translations. 
     self.assertEquals(response.content.strip(), "Welcome to my site.") 

Respuesta

2

He resuelto este mismo tema con el acercamiento número 4. de la respuesta de @Denilson Sá. Resulta que esto no requiere ningún archivo de configuración específico de la prueba y puede definirse por cada prueba con un decorador o gestor de contexto provisto por django (ver overriding settings).

Se puede utilizar como esto:

from django.test import TestCase, override_settings 

class MyTest(TestCase): 
    @override_settings(LANGUAGE_CODE='en-US', LANGUAGES=(('en', 'English'),)) 
    def test_mypage(self): 
     // ... 

El decorador también se puede aplicar a toda la subclase TestCase, o para más control incluso de grano fino también hay un gestor de contexto (véase los documentos de enlaces anteriormente)

siendo este lugar común para mí, yo también define:

english = override_settings(
    LANGUAGE_CODE='en-US', 
    LANGUAGES=(('en', 'English'),), 
) 

Así que ahora puede simplemente usar @english en los casos de prueba que lo requieran.

1

yo creo que tendría más sentido que acaba de forzar el idioma a un entorno conocido para sus pruebas de unidad. Esto significa que estás probando algo que está más cerca de la implementación real.

Para activar un lenguaje específico que podría hacer esto en su configuración:

from django.utils.translation import activate 
... 
activate('en-en') 
+0

Podría ser una buena idea, ¿tiene alguna sugerencia sobre cómo lograrlo? –

+0

Pruebe esto: http://stackoverflow.com/a/9843158/15369 –

+2

FYI, su respuesta no funciona, por las razones que he explicado en mi propia respuesta. Buen intento, sin embargo, pero simplemente no funciona. –

11

Calling .get() o .post() en el cliente de prueba se ejecutará todos los middleware configurados. Esto significa que también se ejecutará LocaleMiddleware, que llamará a translation.get_language_from_request() seguido de translation.activate(language).

Lo que esto significa es que el idioma actualmente activo se ignora y se descarta al escribir pruebas con el cliente de prueba. En otras palabras, el código siguiente no funciona:

def testFoobar(self): 
    c = Client() 
    # This will not work. 
    translation.deactivate_all() 
    # This will not work either. 
    translation.activate('en-us') 
    # The next call will override the earlier activate/deactivate calls. 
    response = c.get("/foobar") 

Hay algunas soluciones:

  1. Ajuste el idioma deseado en el objeto de sesión.
  2. Configurando el idioma deseado en una cookie.
  3. Enviando HTTP_ACCEPT_LANGUAGE encabezado.
  4. Configuración settings.LANGUAGE_CODE

Fuente (de Django 1.4, pero es sobre todo sin cambios desde 1.1 o anterior):

Cuestiones relacionadas