2011-09-09 21 views
27

मैंने Django के परीक्षण ढांचे का उपयोग करना शुरू कर दिया है, और जब तक मैंने प्रमाणित पृष्ठों का परीक्षण शुरू नहीं किया तब तक सब कुछ ठीक काम कर रहा था। ,लॉगिन()

class SimpleTest(TestCase): 
    def setUp(self): 
     user = User.objects.create_user('temporary', '[email protected]', 'temporary') 

    def test_secure_page(self): 
     c = Client() 
     print c.login(username='temporary', password='temporary') 
     response = c.get('/users/secure/', follow=True) 
     user = User.objects.get(username='temporary') 
     self.assertEqual(response.context['email'], '[email protected]') 

मैं इस परीक्षण चलाने के बाद, यह विफल रहता है, और मुझे लगता है कि मुद्रण लॉगिन के रिटर्न मान() रिटर्न सच:

सरलता के लिए, मान लीजिए कि यह एक परीक्षण है चलो लेकिन respond.content लॉगिन पृष्ठ पर रीडायरेक्ट हो जाता है (यदि लॉगिन प्रमाणीकरण सजावटी लॉगिन पृष्ठ पर रीडायरेक्ट विफल रहता है)। मैं डेकोरेटर में एक को तोड़ने का कहना है कि प्रमाणीकरण करता है डाल दिया है:

def authenticate(user): 
    if user.is_authenticated(): 
     return True 
    return False 

और यह वास्तव में झूठी देता है। Test_secure_page() में लाइन 4 उपयोगकर्ता को ठीक से पुनर्प्राप्त करता है। अगर मैं लॉगइन करने के लिए आवेदन के माध्यम से (परीक्षण के बाहर) कोशिश,

@user_passes_test(authenticate, login_url='/users/login') 
def secure(request): 
    user = request.user 
    return render_to_response('secure.html', {'email': user.email}) 
बेशक

, सब कुछ ठीक काम करता है:

यह दृश्य कार्य है।

+1

और कृपया जिस दृश्य का आप परीक्षण कर रहे हैं उसका कोड पोस्ट करें। –

+0

@ एसएलट मैं अपने लॉगिन पेज का परीक्षण नहीं कर रहा था (हालांकि मैंने कोशिश की है, लेकिन यह न तो काम नहीं कर रहा है), लेकिन सिस्टम के बाकी "सुरक्षित" हिस्से में। इसी कारण से, मैंने लॉगिन() का उपयोग करने की कोशिश की। – kevin

+1

@ केविन। मुद्दा यह है कि लॉगिन करने के लिए पोस्ट एक कुकी बनाता है जिसे क्लाइंट द्वारा उपयोग किया जाता है। कोई कुकी नहीं, कोई सुरक्षित पहुंच नहीं है। AFAIK, 'लॉगिन() 'फ़ंक्शन कुकी नहीं बनाता है और इसे क्लाइंट पर वापस कर देता है। क्या आप Django दस्तावेज़ीकरण में उदाहरणों को पुन: पेश करने का प्रयास कर सकते हैं और देख सकते हैं कि वे आपके लिए काम करते हैं या नहीं? –

उत्तर

25

समस्या यह है कि आप अपने टेम्पलेट में RequestContext पास नहीं कर रहे हैं।

इसके अलावा, आपको शायद login_required सजावट और TestCase कक्षा में निर्मित क्लाइंट का उपयोग करना चाहिए।

मैं इस तरह यह पुनर्लेखन चाहते हैं:

#views.py 
from django.contrib.auth.decorators import login_required 
from django.shortcuts import render 

@login_required(login_url='/users/login') 
def secure(request): 
    user = request.user 
    return render(request, 'secure.html', {'email': user.email}) 



#tests.py 
class SimpleTest(TestCase): 
    def setUp(self): 
     user = User.objects.create_user('temporary', '[email protected]', 'temporary') 

    def test_secure_page(self): 
     self.client.login(username='temporary', password='temporary') 
     response = self.client.get('/manufacturers/', follow=True) 
     user = User.objects.get(username='temporary') 
     self.assertEqual(response.context['email'], '[email protected]') 
+1

आपको क्यों लगता है कि RequestContext को पास नहीं करना एक समस्या होनी चाहिए (render_to_response() को संदर्भ दिया गया है)? जब यह ब्राउज़र से आवेदित होता है तो यह परीक्षण ढांचे के बाहर काम करता है (बीटीडब्ल्यू, मैंने RequestContext पास करने का प्रयास किया, लेकिन वही बात होती है)। साथ ही, दृश्य दर्ज होने से पहले प्रमाणीकरण होता है। मैंने @login_required और क्लाइंट टेस्टकेस क्लास से भी कोशिश की, लेकिन फिर भी वही होता है। – kevin

+0

मैंने इसे बदलकर काम किया: self.assertEqual (response.context ['user']। ईमेल, '[email protected]') – cor

10

यह अक्सर एक कस्टम प्रमाणन बैकएंड कि परीक्षण के दौरान प्रमाणीकरण किसी भी प्रकार का bypassess उपयोग करने के लिए उपयोगी हो सकता है: परीक्षण के दौरान

from django.contrib.auth.models import User 

class TestcaseUserBackend(object): 
    def authenticate(self, testcase_user=None): 
     return testcase_user 

    def get_user(self, user_id): 
     return User.objects.get(pk=user_id) 

फिर, तब

AUTHENTICATION_BACKENDS = [ 
    "akindi.testing.auth_backends.TestcaseUserBackend", 
] 

, Durin: अपने AUTHENTICATION_BACKENDS करने के लिए yourapp.auth_backends.TestcaseUserBackend जोड़ने जी परीक्षण, आप बस कॉल कर सकते हैं:

from django.contrib.auth import login 
user = User.objects.get(…) 
login(testcase_user=user) 
+0

उत्कृष्ट उत्तर। –

+1

हो रही है: लॉगिन() को एक अप्रत्याशित कीवर्ड तर्क 'testcase_user' कोई विचार है? – intelis

+0

क्या आप सुनिश्चित हैं कि 'लॉगिन' 'django.contrib.auth' से है (संपादित पोस्ट देखें)?और क्या आप सुनिश्चित हैं कि बैकएंड सही ढंग से जोड़ा जा रहा है? –

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