2012-03-12 47 views
5

使用Django 1.3,Python 2.6中預設語言測試

有一個特別奇怪的問題追查相關 國際化過程中不尊重,RequestFactory與TestClient的測試 意見。

如果我運行:

./manage.py test 

運行所有測試(包括有問題的那些),並順利通過。如果我運行:

./manage.py test <appname> 

應用程序的測試將失敗,拋出一個模板渲染例外的是使用語言代碼,因爲語言的Django 認爲該請求是要求 模板是不是我們所列出語言 settings.LANGUAGES。 (在這種情況下,它一直是「EN-US」,我們支持衣櫃匹配的語言是「恩」)

這是一個測試的例子將失敗:

class TemplateServingTestCase(TestCase): 
    def setUp(self): 
     self.app_dir  = os.path.abspath(os.path.dirname(__file__)) 
     self.gallery_root = os.path.join(self.app_dir, 'test_gallery') 
     self.gallery_url = '/' 
     self.request  = RequestFactory().get('/') 

    def test_404_invalid_category(self): 
     self.assertRaises(Http404, gallery_page, 
      self.request, 
      'bad-category', 
      self.gallery_root, 
      self.gallery_url 
     ) 

這個問題不會如果使用django的TestClient向調用特定視圖的網址發出 請求,則會發生。但是,如果只是使用RequestFactory的get或put方法調用相同的 視圖,它將拋出上述錯誤。

看起來好像在使用RequestFactory方法時, 設置文件沒有得到遵守。我在這裏錯過了一些簡單的 ?

其他信息

適用區域設置

LANGUAGE_CODE = 'en' 
LANGUAGES = (
    ('en', 'English'), 
    ('de', 'Deutsch'), 
    ('es', 'Espanol'), 
    ('fr', 'Francaise'), 
    ('it', 'Italiano'), 
    ('pt-br', 'Portugues (Brasil)'), 
) 

主動中間件

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'services.middleware.LegacyIntegrationMiddleware', 
) 

回答

5

有以下兩種方式:

a)您在settings.MIDDLEWARE_CLASSES 'django.middleware.locale.LocaleMiddleware'

在這種情況下,客戶端使用settings.LANGUAGE_CODE

b)你沒有。

在這種情況下,你應該將語言類的地方你tests.py模塊:

from django.utils.translation import activate 
... 
activate('fr-fr') 

https://code.djangoproject.com/ticket/15143

+2

見上文編輯,a)按預期在這種情況下是行不通的。 b)是否解決了這個問題,但仍然很好奇爲什麼RequestFactory不尊重設置文件。 – kaptainlange 2012-03-23 17:29:24

+0

經過測試a),適用於我的Python和Django相同版本。謹防中間件訂購。 – Stan 2012-03-23 18:09:04

+0

您的'LANGUAGE_CODE'設置看起來無效。 https://docs.djangoproject.com/en/1.3/ref/settings/#language-code – Stan 2012-03-23 18:48:19

0

但是如果同樣的觀點被簡單地稱爲與RequestFactory的結果獲取或放置方法,它會拋出上面的錯誤。

我想象你正在做的事情,如:

from django.utils import translation 
from app.views import some_view 

# Using translation.activate is pretty well known, so I suppose you 
# also do this: 
translation.activate(<whatever language you want>) 

request_factory = RequestFactory() 
request = request_factory.get("/foo") 

response = some_view(request) 

然後由該請求產生的URL都None,而不是你想要的語言。您可以嘗試使用帶有語言前綴的網址。您可以嘗試在您的請求中設置語言Cookie。你可以嘗試擺弄會議。什麼都沒有

原因是不工作是因爲你繞過整個中間件機械。你直接調用視圖。 Django不會介入,接受請求並將其傳遞給中間件。

什麼可以 do是調用你需要的任何中間件,或者你可以複製中間件所做的。爲了得到與RequestFactory產生兌現的語言設置的要求,我選擇了後者,我這樣做:

translation.activate("en-us") 
request.LANGUAGE_CODE = "en-us" 
response = some_view(request) 

這是足以讓我獲得語言的前綴添加到我的網址。