django 测试用户是否成功登录

hgqdbh6s  于 2023-01-03  发布在  Go
关注(0)|答案(6)|浏览(135)

如何测试用户在提交注册表后是否已登录?
我尝试了下面的代码,但是在我将登录逻辑添加到注册视图之前,它就返回了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
sxpgvts3

sxpgvts31#

你可以使用auth模块的get_user方法,它说它想要一个请求作为参数,但是它只使用请求的session属性,而我们的Client正好有这个属性。

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

jmp7cifd2#

这不是最佳答案。请参见https://stackoverflow.com/a/35871564/307511

Chronial在下面给出了一个很好的例子来说明如何做出这个Assert。他的答案比我现在的代码更好。
测试用户是否登录的最直接方法是测试Client对象:

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

您还可以检查特定用户是否已登录:

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

作为附加信息,response.request对象不是HttpRequest对象;相反,它是一个普通的dict,包含一些关于实际请求的信息,因此无论如何它都不会有user属性。
此外,测试response.context对象是不安全的,因为您并不总是拥有上下文。

zwghvu4y

zwghvu4y3#

Django的TestClient有一个login方法,如果用户成功登录,则返回True。

wkyowqbh

wkyowqbh4#

User模型上的is_authenticated()方法总是返回True。在request.userAnonymousUser的示例的情况下,request.user.is_authenticated()返回False,而is_authenticated()方法总是返回False。在测试时,您可以查看response.context['request'].user.is_authenticated()
您还可以尝试访问test中需要登录的另一个页面,并查看response.status是否返回200302(从login_required重定向)。

7xzttuei

7xzttuei5#

你在哪里初始化你的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来访问另一个需要用户身份验证的url。继续上面的操作,访问另一个页面:

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

上面的代码应该返回200以确认用户已经通过了身份验证,否则,它将重定向到带有302代码的登录页面。

b5lpy0ml

b5lpy0ml6#

还有另一种简洁的方法,在response中使用wsgi_request

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

和@Chronial的方式也可用于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更简单。

相关问题