2012-03-12 33 views
5

Sử dụng Django 1.3, Python 2.6Ngôn ngữ mặc định thông qua các thiết lập không được tôn trọng trong thử nghiệm

Có một vấn đề đặc biệt kỳ lạ để theo dõi liên quan đến quốc tế hóa, và RequestFactory vs TestClient để thử nghiệm quan điểm.

Nếu tôi chạy:

./manage.py test 

Tất cả các bài kiểm tra chạy (kể cả những người có vấn đề) và vượt qua thành công. Nếu tôi chạy:

./manage.py test <appname> 

thử nghiệm của ứng dụng sẽ thất bại, ném một mẫu render ngoại lệ cho mẫu mà sử dụng mã ngôn ngữ vì django ngôn ngữ nghĩ yêu cầu được yêu cầu không phải là một ngôn ngữ chúng tôi đã liệt kê trong cài đặt.LANGUAGES. (Trong trường hợp này nó luôn luôn là 'en-us', ngôn ngữ phù hợp với tủ quần áo chúng tôi hỗ trợ là 'en')

Dưới đây là một ví dụ về một bài kiểm tra đó sẽ thất bại:

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 
     ) 

Vấn đề này sẽ không xảy ra nếu TestClient của django được sử dụng để thực hiện yêu cầu tới url gọi một chế độ xem cụ thể. Tuy nhiên, nếu cùng chế độ xem được gọi đơn giản với kết quả của RequestFactory hoặc đặt phương thức , nó sẽ ném lỗi ở trên.

Dường như khi sử dụng phương pháp RequestFactory, tệp cài đặt không được tôn trọng. Tôi có thiếu cái gì đơn giản ở đây không?

Thông tin bổ sung

thiết lập miền địa phương áp dụng

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

tích cực middleware

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

Trả lời

5

Có 2 khả năng:

a) Bạn có 'django.middleware.locale.LocaleMiddleware' trong settings.MIDDLEWARE_CLASSES.

Trong trường hợp này, khách hàng sử dụng settings.LANGUAGE_CODE.

b) Bạn không.

Trong trường hợp đó, bạn nên thiết lập ngôn ngữ như vậy ở đâu đó trong mô-đun tests.py của bạn:

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

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

+2

Xem các chỉnh sửa ở trên, a) không hoạt động như mong đợi trong trường hợp này. b) Không giải quyết vấn đề, nhưng vẫn thực sự tò mò tại sao RequestFactory không tôn trọng các tập tin cài đặt. – kaptainlange

+0

Thử nghiệm a) và hoạt động cho tôi với cùng phiên bản Python và Django. Cẩn thận với việc đặt hàng phần mềm trung gian. – Stan

+0

Cài đặt 'LANGUAGE_CODE' của bạn trông không hợp lệ. https://docs.djangoproject.com/en/1.3/ref/settings/#language-code – Stan

0

Tuy nhiên nếu đó là quan điểm tương tự được gọi đơn giản là với kết quả của RequestFactory của có được hoặc đặt các phương thức, nó sẽ ném lỗi ở trên.

Tôi tưởng tượng bạn đang làm một cái gì đó như:

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) 

Sau đó, các URL được tạo ra bởi các yêu cầu có None thay vì ngôn ngữ mà bạn muốn. Bạn có thể thử sử dụng một URL có tiền tố ngôn ngữ. Bạn có thể thử đặt cookie ngôn ngữ trong yêu cầu của mình. Bạn có thể thử chơi với phiên. Không có gì hiệu quả.

Lý do không hoạt động là vì bạn đang bỏ qua toàn bộ máy móc trung gian. Bạn đang gọi trực tiếp chế độ xem. Django sẽ không can thiệp, nhận yêu cầu và chuyển nó qua các phần mềm trung gian.

Điều bạn có thể làm là gọi bất kỳ phần mềm trung gian nào bạn cần hoặc bạn có thể sao chép phần mềm trung gian làm gì. Để có được một yêu cầu sản xuất với RequestFactory để tôn vinh các thiết lập ngôn ngữ, tôi đã chọn sau này và tôi đã làm điều này:

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

Đây là đủ cho tôi để có được những tiền tố ngôn ngữ được bổ sung vào các URL của tôi.

Các vấn đề liên quan