2012-05-31 7 views
8

Używam narzędzi do tłumaczenia niektórych ciągów z mojej aplikacji. Kod wygląda następująco:Jak wyłączyć tłumaczenia podczas testów jednostkowych w django?

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

Następnie piszę testy jednostkowe za pomocą Django test client. Testy te wysyłają żądanie do widoku i porównują zwróconą treść.

Jak mogę wyłączyć tłumaczenia podczas uruchamiania testów jednostkowych? Zamierzam to zrobić:

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

Odpowiedz

2

I rozwiązać ten sam problem z podejściem numer 4. z odpowiedzi @Denilson Sá. Okazuje się, że nie wymaga to żadnego pliku ustawień specyficznych dla testu i można go zdefiniować na podstawie testu za pomocą dekoratora lub menedżera kontekstu dostarczonego przez django (patrz overriding settings).

Może być stosowany tak:

from django.test import TestCase, override_settings 

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

Dekorator może być również stosowana do całej TestCase podklasy, lub nawet bardziej drobnoziarnistej kontroli istnieje również kierownik kontekst (patrz dokumenty związane przede).

Będąc to raczej wspólne dla mnie, zdefiniowano również:

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

Tak, że teraz mogę po prostu użyć @english na testach wymagających go.

1

Sądzę, że bardziej sensownym byłoby wymuszenie języka na znanym ustawieniu dla testów jednostkowych. Oznacza to, że testujesz coś, co jest bliższe rzeczywistej implementacji.

Aby aktywować specyficzny język można to zrobić w konfiguracji:

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

To może być dobry pomysł, czy masz sugestie, jak to osiągnąć? –

+0

Spróbuj tego: http://stackoverflow.com/a/9843158/15369 –

+2

FYI, twoja odpowiedź nie działa, z powodów, które wyjaśniłem w mojej własnej odpowiedzi. Fajna próba, ale po prostu nie działa. –

11

Wywołanie .get() lub .post() na kliencie testowym będzie uruchamiać wszystkie skonfigurowane middleware. Oznacza to, że uruchomi on także LocaleMiddleware, który zadzwoni pod numer translation.get_language_from_request(), a następnie translation.activate(language).

Co oznacza, że ​​aktualnie aktywny język jest ignorowany i wyrzucany podczas pisania testów za pomocą klienta testowego. Innymi słowy, poniższy kod nie działa:

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

kilka rozwiązań:

  1. Ustawianie żądanego języka w obiekcie sesji.
  2. Ustawianie żądanego języka w pliku cookie.
  3. Wysyłanie nagłówka HTTP_ACCEPT_LANGUAGE.
  4. Ustawianie settings.LANGUAGE_CODE

Źródło (od Django 1.4, ale najczęściej jest to niezmienna od 1,1 lub wcześniej):

Powiązane problemy