2012-05-31 20 views
8

Sto usando gli strumenti Django Internationalization per tradurre alcune stringhe dalla mia applicazione. Il codice è simile al seguente:Come disabilitare le traduzioni durante i test unitari in django?

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

Poi, sto scrivendo unit test utilizzando il Django test client. Questi test fanno una richiesta alla vista e confrontano i contenuti restituiti.

Come faccio a disattivare le traduzioni durante l'esecuzione dei test di unità? Ho intenzione di fare questo:

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.") 

risposta

2

Ho risolto questo stesso problema con l'approccio numero 4. dalla risposta di @Denilson Sá. Si scopre questo non richiede alcun file di impostazioni specifiche di prova e può essere definito su una base per-test con un decoratore o il contesto Manager fornito da Django (vedi overriding settings).

Può essere usato così:

from django.test import TestCase, override_settings 

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

Il decoratore può anche essere applicata all'intera sottoclasse TestCase, o per un controllo ancora più capillare c'è anche un gestore di contesto (vedere i documenti collegati sopra).

Essendo questo piuttosto comune per me, ho anche definito:

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

Così ora posso semplicemente utilizzare @english sui casi di test che lo richiedono.

1

penserei che avrebbe più senso per forzare solo la lingua ad un ambiente noto per il test di unità. Ciò significa che stai testando qualcosa che è più vicino alla reale implementazione.

Per attivare una lingua specifica che si possa fare questo nella vostra configurazione:

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

Potrebbe essere una buona idea, avete suggerimenti su come raggiungerlo? –

+0

Prova questo: http://stackoverflow.com/a/9843158/15369 –

+2

FYI, la tua risposta non funziona, per i motivi che ho spiegato nella mia risposta. Bel tentativo, però, ma semplicemente non funziona. –

11

Calling .get() o .post() sul client di test verrà eseguito tutti i middleware configurati. Ciò significa che sarà anche eseguire LocaleMiddleware, che chiamerà translation.get_language_from_request() seguita da translation.activate(language).

Ciò significa che la lingua attualmente attivo viene ignorato e gettata via durante la scrittura di test utilizzando il client di prova. In altre parole, il seguente codice non funziona:

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") 
Ci

alcune soluzioni:

  1. Impostazione della lingua desiderata verso l'oggetto della sessione.
  2. Impostazione della lingua desiderata in un cookie.
  3. Invio intestazione HTTP_ACCEPT_LANGUAGE.
  4. Impostazione settings.LANGUAGE_CODE

Fonte (da Django 1.4, ma è in gran parte invariata dal 1.1 o versioni precedenti):

Problemi correlati