Soru Kullanıcının başarıyla giriş yaptığını test edin


Kayıt formunu gönderdikten sonra bir kullanıcının giriş yaptığını nasıl test edebilirim?

Aşağıdakileri denedim ama döndü True Kayıt mantığına giriş mantığını eklemeden önce bile.

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()

Test edilen kod:

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


Menşei


Denedin mi response.request.user.is_authenticated()? - Bernhard Vallant
Yaptım ama istek nesnesinin bir kullanıcı nesnesi yok. - Pickels


Cevaplar:


Bu en iyi cevap değil. Görmek https://stackoverflow.com/a/35871564/307511

Chronial verdi   Bu iddianın nasıl yapılacağına dair mükemmel bir örnek. Onun cevabı   günümüzde benim için koddan daha iyi.


Bir kullanıcının oturum açıp açmadığını test etmenin en basit yolu, Müşteri nesnesini test ederek:

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

Belirli bir kullanıcının giriş yapıp yapmadığını da kontrol edebilirsiniz:

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

Ek bilgi olarak response.request nesne bir değil HttpRequest nesne; bunun yerine, gerçek istek hakkında bazı bilgileri içeren sıradan bir dict, bu yüzden user yine de özniteliği.

Ayrıca, test response.context Nesne güvenli değil çünkü siz bir bağlamınız yok.


67
2018-05-16 04:15



Ek bir güvence gibi, aynı testi yapabilirsiniz ancak SESSION_KEY değişken. Bunun gibi: from django.contrib.auth import SESSION_KEY  self.assertTrue(SESSION_KEY in self.client.session)  Bunu, Ajan uygulamasında kullanılmakta olan Django çerçevesinde görebilirsiniz. github ... Test / views.py    Ayrıca bir kullanıcının giriş yaptığını test etmek için bir kolaylık fonksiyonuna sahiptirler: github ... Test / views.py - bobc
Tamamladığınız için teşekkürler, bunun farkında değildim. :) - emyller
İlk yorum bağlantısı kesildi - şimdi burada barındırılıyor - github.com/django/django-old/blob/master/django/contrib/auth/... - Saurabh Hirani
@AdamStarrh A SessionStore nesne, dikte benzeri bir nesne olmalıdır. Deneyin dict() ve ne aldığını gör. - emyller
Bu doğru değil - tüm bağlamlarda giriş doğru bir şekilde doğrulamaz ve kullanılmamalıdır. Daha doğru bir sürüm için cevabımı aşağıya bakın: stackoverflow.com/a/35871564/758345 - Chronial


Kullanabilirsiniz get_user yöntem auth modülü. Parametre olarak bir istek istediğini söylüyor, ancak sadece session isteğin özniteliği. Ve sadece bizim Client bu özelliğe sahip.

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

45
2018-03-08 15:34



Bir test vakası bağlamında çalışacağından emin misiniz? - emyller
Eh, ben bunu kullanıyorum :) - Chronial
+1 bu harika bir cevaptır ve yararlı bir iddiada bulunur: gist.github.com/bengolder/c9dc7006f9d6b4d17d5af5465115df73 - BenjaminGolder
Bu harika bir hile: D - Anjaneyulu Batta
Bu Django 2.0.5 olarak çalışmıyor. İlk is_authenticated şimdi bir özelliktir ve kalınabilir değildir. Başarılı bir giriş için bile doğru değil. - MadeOfAir


Django'nun TestClient'i bir giriş yöntemi kullanıcı başarıyla giriş yapmışsa True değerini döndürür.


8
2018-05-14 10:22



Bunun dışında, login () çağrısı yapan test değildir. - Manur


Yöntem is_authenticated() üzerinde User model her zaman döndürür True. False için döndü request.user.is_authenticated() durumunda request.user bir örneğidir AnonymousUser, hangi is_authenticated() yöntem her zaman döndürür False. Test ederken bir göz atabilirsiniz response.context['request'].user.is_authenticated().

Ayrıca giriş yapmanız gereken başka bir sayfaya giriş yapmayı deneyebilir ve response.status döner 200 veya 302 (yönlendirme login_required).


5
2018-04-14 09:35



Response.request.user nesnesinin olmamasının nedeni ne olabilir? İstek dict ['CONTENT_LENGTH': 244, 'wsgi.input': <django.test.client.FakePayload nesnesi: 0x31e9950>, 'REQUEST_METHOD': 'POST', 'PATH_INFO': '/ register / ',' CONTENT_TYPE ':' multipart / form-data; boundary = BoUnDaRyStRiNg ',' QUERY_STRING ':' '} - Pickels
Test ettiğim kodu ekledim. - Pickels
Kullanıyor musun django.contrib.auth.middleware.AuthenticationMiddleware? - Bernhard Vallant
Evet, varsayılan ara katman kullanarak. - Pickels
Onu test ettim ve cevabımı yukarıda düzenledim :) - Bernhard Vallant


Nereden başlıyorsun self.client? Başka ne var setUp yöntem? Bende benzer bir test var ve kodun iyi çalışması gerekiyor. İşte ben böyle yaparım:

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

DÜZENLE

Giriş mantığımı açıklarsam, self.client.post(. Kullanıcının doğrulanmış olup olmadığını kontrol etmek istiyorsanız, self.client kullanıcı kimlik doğrulaması gerektiren başka bir URL'ye erişmek için. Yukarıdakilerden devam ederek başka bir sayfaya erişin:

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

Yukarıdaki, kullanıcının doğruladığı onaylamak için 200 değerini döndürmelidir. Başka bir şey, 302 kodu ile giriş sayfasına yönlendirecektir.


1
2018-04-14 14:53



User.objects.all () [0] yazdırın .is_authenticated (), giriş mantığını uygulamadan önce test etmeyi denediniz mi? Çünkü diğerlerinin söylediklerinden ne anladığım, bunun her zaman doğru olacağıdır. Request.user.is_authenticated adresine ihtiyacınız var. Ayrıca django TestCase zaten başlatılmış bir istemci nesnesi ile birlikte gelir, bu yüzden iki kez yapmaya gerek yok. - Pickels
Düzenlenmiş cevaba bakınız. - Thierry Lam


Kullanmanın başka bir yolu var. wsgi_request içinde response:

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

ve @Chronial 'ın tarzı ile de kullanılabilir wsgi_request:

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

Çünkü response.wsgi_request nesnenin bir session bağlıyor.

Ancak, düşünüyorum düşünüyorum response.wsgi_request.user daha basittir.


0
2018-04-07 06:51