2012-03-12 16 views
5

परीक्षण अंतर्राष्ट्रीयकरण करने के लिए संबंधित को ट्रैक करने के लिए Django 1.3, अजगर 2.6डिफ़ॉल्ट भाषा

एक विशेष रूप से अजीब समस्या होने का प्रयोग के दौरान नहीं सम्मान, और RequestFactory TestClient बनाम विचारों के परीक्षण के लिए।

अगर मैं चलाएँ:

./manage.py test 

(समस्याग्रस्त लोगों सहित) सभी परीक्षण चलाने के लिए और सफलतापूर्वक गुजरती हैं। अगर मैं चलाएँ:

./manage.py test <appname> 

एप्लिकेशन के परीक्षण असफल हो जायेगी, टेम्पलेट्स क्योंकि भाषा Django सोचता अनुरोध के लिए पूछ रहा है कि भाषा कोड का उपयोग के लिए अपवाद प्रतिपादन एक टेम्पलेट फेंक एक भाषा हम में सूचीबद्ध किया है नहीं है सेटिंग्स। LANGUAGES।

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 
     ) 

यह समस्या नहीं:

यहाँ एक परीक्षण का एक उदाहरण है कि असफल हो जायेगी है (इस मामले में यह हमेशा 'en-US' कोठरी मिलान भाषा हम समर्थन किया जा रहा है 'en' किया गया है,) तब होता है जब django के TestClient को एक यूआरएल के अनुरोध के लिए उपयोग किया जाता है जो किसी विशेष दृश्य को कॉल करता है। हालांकि यदि वही व्यू को केवल अनुरोध फ़ैक्टरी के परिणाम के साथ बुलाया जाता है या विधियों को डाल दिया जाता है, तो यह उपर्युक्त त्रुटि को फेंक देगा।

ऐसा लगता है कि अनुरोध फ़ैक्टरी विधि का उपयोग करते समय, सेटिंग्स फ़ाइल का सम्मान नहीं किया जा रहा है। क्या मुझे यहां कुछ सरल याद आ रहा है?

क) आप settings.MIDDLEWARE_CLASSES में 'django.middleware.locale.LocaleMiddleware' है:

अतिरिक्त सूचना

लागू लोकेल सेटिंग

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

2 संभावनाएं हैं।

इस मामले में, ग्राहक settings.LANGUAGE_CODE का उपयोग करता है।

बी) आप नहीं करते हैं।

उस मामले में, आप अपने tests.py मॉड्यूल में है कि कहीं की तरह भाषा सेट करना चाहिए:

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

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

+2

उपरोक्त संपादन देखें, ए) इस मामले में अपेक्षित काम नहीं कर रहा है। बी) समस्या हल करता है, लेकिन अभी भी वास्तव में उत्सुक है क्यों RequestFactory सेटिंग्स फ़ाइल का सम्मान नहीं करता है। – kaptainlange

+0

परीक्षण किया गया एक) और पाइथन और Django के समान संस्करणों के साथ मेरे लिए काम करता है। ऑर्डरवेयर ऑर्डरिंग से सावधान रहें। – Stan

+0

आपकी 'LANGUAGE_CODE' सेटिंग अमान्य दिखती है। https://docs.djangoproject.com/en/1.3/ref/settings/#language-code – Stan

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) 

तो यूआरएल अनुरोध द्वारा उत्पादित भाषा आप चाहते थे के बजाय None है। आप एक भाषा उपसर्ग के साथ एक यूआरएल का उपयोग करने का प्रयास कर सकते हैं। आप अपने अनुरोध में एक भाषा कुकी सेट करने का प्रयास कर सकते हैं। आप सत्र के साथ झुकाव की कोशिश कर सकते हैं। कुछ भी काम नहीं करता है।

कारण काम नहीं करता है क्योंकि आप संपूर्ण मिडलवेयर मशीनरी को छोड़ रहे हैं। आप सीधे दृश्य को बुला रहे हैं। Django हस्तक्षेप नहीं करेगा, अनुरोध ले और इसे midwares के माध्यम से पारित करें।

क्या आप कर सकते हैं जो भी मिडलवेयर आपको चाहिए, या आप मिडलवेयर क्या कर सकते हैं दोहराना कर सकते हैं। आदेश में एक अनुरोध भाषा सेटिंग्स को सम्मानित करने के RequestFactory के साथ उत्पादन किया पाने के लिए, मैं बाद चुना है और मैं इस किया था:

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

यह मैं भाषा उपसर्ग मेरी URL में जोड़े गए पाने के लिए पर्याप्त था।

संबंधित मुद्दे