सवाल परीक्षण करें कि उपयोगकर्ता सफलतापूर्वक लॉग इन किया गया था


पंजीकरण फॉर्म जमा करने के बाद मैं कैसे परीक्षण कर सकता हूं कि उपयोगकर्ता लॉग इन है?

मैंने निम्नलिखित की कोशिश की लेकिन यह लौट आया True मेरे पंजीकरण दृश्य में लॉगिन तर्क जोड़ने से पहले भी।

def test_that_user_gets_logged_in(self):
    response = self.client.post(reverse('auth-registration'), 
                                { 'username':'foo', 
                                  'password1':'bar', 
                                  'password2':'bar' } )

    user = User.objects.get(username='foo')
    assert user.is_authenticated()

कोड का परीक्षण किया जा रहा है:

class RegistrationView(CreateView):
    template_name = 'auth/registration.html'
    form_class = UserCreationForm
    success_url = '/'

    def auth_login(self, request, username, password):
        '''
        Authenticate always needs to be called before login because it
        adds which backend did the authentication which is required by login.
        '''

        user = authenticate(username=username, password=password)
        login(request, user)

    def form_valid(self, form):
        '''
        Overwrite form_valid to login.
        '''

        #save the user
        response = super(RegistrationView, self).form_valid(form)

        #Get the user creditials
        username = form.cleaned_data['username']
        password = form.cleaned_data['password1']

        #authenticate and login
        self.auth_login(self.request, username, password)

        return response

44
2018-04-14 09:16


मूल


क्या आप ने कोशिश की response.request.user.is_authenticated()? - Bernhard Vallant
मैंने किया लेकिन अनुरोध ऑब्जेक्ट में उपयोगकर्ता ऑब्जेक्ट नहीं है। - Pickels


जवाब:


यह सबसे अच्छा जवाब नहीं है। देख https://stackoverflow.com/a/35871564/307511

Chronial दिया गया है   नीचे इस दावे को कैसे बनाया जाए इस पर एक उत्कृष्ट उदाहरण है। उसका जवाब   आजकल कोड के लिए मेरा से बेहतर।


क्लाइंट ऑब्जेक्ट का परीक्षण करके उपयोगकर्ता लॉग इन करने का परीक्षण करने का सबसे सरल तरीका है:

self.assertIn('_auth_user_id', self.client.session)

आप यह भी जांच सकते हैं कि कोई विशिष्ट उपयोगकर्ता लॉग इन है या नहीं:

self.assertEqual(int(self.client.session['_auth_user_id']), user.pk)

एक अतिरिक्त जानकारी के रूप में, response.request वस्तु एक नहीं है HttpRequest वस्तु; इसके बजाए, वास्तविक अनुरोध के बारे में कुछ जानकारी के साथ यह एक साधारण नियम है, इसलिए इसमें नहीं होगा user वैसे भी विशेषता।

इसके अलावा, परीक्षण response.context ऑब्जेक्ट सुरक्षित नहीं है क्योंकि आपके पास कोई संदर्भ नहीं है।


67
2018-05-16 04:15



एक अतिरिक्त आश्वासन के रूप में आप एक ही परीक्षण कर सकते हैं लेकिन इसका मूल्य उपयोग कर सकते हैं SESSION_KEY चर। इस कदर: from django.contrib.auth import SESSION_KEY  self.assertTrue(SESSION_KEY in self.client.session)  आप इसे Django ढांचे में एथ ऐप में इस्तेमाल किया जा सकता है: GitHub ... परीक्षा / views.py    उनके पास यह जांचने के लिए सुविधा सुविधा भी है कि उपयोगकर्ता ने लॉग आउट किया है: GitHub ... परीक्षा / views.py - bobc
पूरक के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था। :) - emyller
पहला टिप्पणी लिंक टूटा हुआ है - यह वह जगह है जहां इसे होस्ट किया गया है - github.com/django/django-old/blob/master/django/contrib/auth/... - Saurabh Hirani
@AdamStarrh ए SessionStore वस्तु एक dict-like वस्तु होना चाहिए। की कोशिश dict() यह और देखें कि आपको क्या मिलता है। - emyller
यह सही नहीं है - यह सभी संदर्भों में लॉगिन को सही ढंग से मान्य नहीं करेगा और इसका उपयोग नहीं किया जाना चाहिए। अधिक सही संस्करण के लिए नीचे मेरा उत्तर देखें: stackoverflow.com/a/35871564/758345 - Chronial


आप इसका उपयोग कर सकते हैं get_user की विधि auth मॉड्यूल। यह कहता है कि यह पैरामीटर के रूप में अनुरोध चाहता है, लेकिन यह केवल कभी भी उपयोग करता है session अनुरोध की विशेषता। और यह बस हमारे होता है Client उस विशेषता है।

from django.contrib import auth
user = auth.get_user(self.client)
assert user.is_authenticated()

45
2018-03-08 15:34



क्या आप वाकई टेस्ट केस संदर्भ में काम करेंगे? - emyller
खैर, यही वह जगह है जहां मैं इसका उपयोग कर रहा हूं :) - Chronial
+1 यह एक अच्छा जवाब है और एक उपयोगी दावा करेगा: gist.github.com/bengolder/c9dc7006f9d6b4d17d5af5465115df73 - BenjaminGolder
यह कमाल की चाल है: डी - Anjaneyulu Batta
यह Django 2.0.5 के रूप में काम नहीं करता है। प्रथम is_authenticated अब एक संपत्ति है और एक कॉल करने योग्य नहीं है। यह एक सफल लॉगिन के लिए भी सच नहीं है। - MadeOfAir


Django के टेस्ट क्लाइंट में एक है लॉगिन विधि जो उपयोगकर्ता को सफलतापूर्वक लॉग इन किया गया था, जो सच हो जाता है।


8
2018-05-14 10:22



सिवाय इसके कि वह परीक्षण नहीं है जो लॉगिन () कॉल करता है। - Manur


प्रक्रिया is_authenticated() पर User मॉडल हमेशा देता है TrueFalse के लिए वापस आ गया है request.user.is_authenticated() उस मामले में request.user का एक उदाहरण है AnonymousUser, कौन कौन से is_authenticated() विधि हमेशा वापस आती है False। परीक्षण करते समय आप देख सकते हैं response.context['request'].user.is_authenticated()

आप परीक्षण में किसी अन्य पृष्ठ तक पहुंचने का प्रयास भी कर सकते हैं जिसमें लॉग इन होना आवश्यक है, और देखें कि क्या response.status रिटर्न 200 या 302 (से रीडायरेक्ट करें login_required)।


5
2018-04-14 09:35



क्या कारण हो सकता है कि मेरे पास कोई प्रतिक्रिया नहीं है .request.user ऑब्जेक्ट? यह अनुरोध है कि अनुरोध dict {{CONTENT_LENGTH ': 244,' wsgi.input ': <django.test.client.FakePayload ऑब्जेक्ट 0x31e9950>,' REQUEST_METHOD ':' POST ',' PATH_INFO ':' / रजिस्टर / ',' CONTENT_TYPE ':' मल्टीपार्ट / फॉर्म-डेटा; सीमा = BoUnDaRyStRiNg ',' QUERY_STRING ':' '} - Pickels
मैंने कोड जोड़ा जो मैं परीक्षण कर रहा हूं। - Pickels
आप उपयोग कर रहे django.contrib.auth.middleware.AuthenticationMiddleware? - Bernhard Vallant
हाँ, डिफ़ॉल्ट मिडलवेयर का उपयोग कर। - Pickels
मैंने इसका परीक्षण किया है और ऊपर अपना जवाब संपादित किया है :) - Bernhard Vallant


आप कहां शुरू कर रहे हैं self.client? आपके अंदर और क्या है setUp तरीका? मेरे पास एक समान परीक्षण है और आपका कोड ठीक काम करना चाहिए। यहां बताया गया है कि मैं इसे कैसे करता हूं:

from django.contrib.auth.models import User
from django.test import TestCase
from django.test.client import Client


class UserTestCase(TestCase):

    def setUp(self):
        self.client = Client()

    def testLogin(self):
        print User.objects.all() # returns []
        response = self.client.post(reverse('auth-registration'), 
                            { 'username':'foo', 
                              'password1':'bar', 
                              'password2':'bar' } )
        print User.objects.all() # returns one user
        print User.objects.all()[0].is_authenticated() # returns True

संपादित करें

अगर मैं अपने लॉगिन तर्क पर टिप्पणी करता हूं, तो मुझे कोई उपयोगकर्ता नहीं मिल रहा है self.client.post(। यदि आप वास्तव में जांचना चाहते हैं कि उपयोगकर्ता को प्रमाणित किया गया है, तो इसका उपयोग करें self.client एक और यूआरएल तक पहुंचने के लिए जिसके लिए उपयोगकर्ता प्रमाणीकरण की आवश्यकता होती है। उपर्युक्त से जारी, दूसरे पृष्ठ तक पहुंचें:

response = self.client.get(reverse('another-page-which-requires-authentication'))
print response.status_code

उपरोक्त को प्रमाणित करने के लिए उपरोक्त 200 वापस लौटना चाहिए। और कुछ भी, यह 302 कोड के साथ लॉगिन पेज पर रीडायरेक्ट करेगा।


1
2018-04-14 14:53



प्रिंट करें User.objects.all () [0] .is_authenticated () क्या आपने अपना लॉगिन तर्क लागू करने से पहले परीक्षण करने का प्रयास किया था? क्योंकि जो कुछ मैंने दूसरों से कहा है उससे मैं समझता हूं कि यह हमेशा सच हो जाएगा। आपको request.user.is_authenticated की आवश्यकता है। इसके अलावा django टेस्टकेस पहले से शुरू किए गए क्लाइंट ऑब्जेक्ट के साथ आता है, इसलिए इसे दो बार करने की आवश्यकता नहीं है। - Pickels
संपादित उत्तर देखें। - Thierry Lam


उपयोग कर एक और संक्षिप्त तरीका है wsgi_request में response:

response = self.client.post('/signup', data)
assert response.wsgi_request.user.is_authenticated()

और @ क्रोनियल का तरीका भी उपलब्ध है wsgi_request:

from django.contrib import auth
user = auth.get_user(response.wsgi_request)
assert user.is_authenticated()

इसलिये response.wsgi_request वस्तु एक है session विशेषता।

हालांकि, मुझे लगता है कि उपयोग कर रहा हूँ response.wsgi_request.user अधिक सरल है।


0
2018-04-07 06:51