2012-05-31 28 views
8

我使用Django Internationalization工具來從我的應用程序中翻譯一些字符串。代碼如下所示:如何在django的單元測試期間禁用翻譯?

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

然後,我正在寫使用Django test client單元測試。這些測試向視圖發出請求並比較返回的內容。

如何在運行單元測試時禁用翻譯?我的目標要做到這一點:

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

回答

2

我解決了這個同樣的問題從@DenilsonSá的回答中獲得方法4。事實證明,這不需要任何測試特定的設置文件,並且可以使用由django提供的修飾器或上下文管理器在每個測試的基礎上定義(參見overriding settings)。

它可用於這樣的:

from django.test import TestCase, override_settings 

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

裝飾器也可以應用到整個測試用例的子類,或甚至更精細的控制也有一個上下文管理器(見上面鏈接的文檔)。

正在這個相當普遍的對於我來說,我也定義:

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

所以,現在我可以簡單地在需要它的測試用例使用@english

1

我認爲這將更有意義,正義的力量的語言,爲您的單元測試已知的設置。這意味着你正在測試更接近實際實現的東西。

要激活,你可以在你的安裝做這個特定的語言:

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

這可能是一個好主意,你有如何實現這一目標的建議? –

+0

試試這個:http://stackoverflow.com/a/9843158/15369 –

+2

僅供參考,您的答案不起作用,由於我在我自己的答案中解釋的原因。不錯,儘管如此,但它根本行不通。 –

11

測試客戶端調用.get().post()將運行配置的所有中間件。這意味着它也將運行LocaleMiddleware,這將呼叫translation.get_language_from_request(),然後是translation.activate(language)

這意味着當使用測試客戶端編寫測試時,當前活動的語言將被忽略並丟棄。換句話說,下面的代碼無法正常工作:

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

有幾個解決方案:

  1. 在會話對象設置所需的語言。
  2. 在cookie中設置所需的語言。
  3. 發送HTTP_ACCEPT_LANGUAGE標題。
  4. 設置settings.LANGUAGE_CODE

源(From Django的1.4,但它是因爲1.1大多持平或更早):

相關問題