如何测试用户在提交注册表后是否已登录?
我尝试了下面的代码,但是在我将登录逻辑添加到注册视图之前,它就返回了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
6条答案
按热度按时间sxpgvts31#
你可以使用
auth
模块的get_user
方法,它说它想要一个请求作为参数,但是它只使用请求的session
属性,而我们的Client
正好有这个属性。jmp7cifd2#
这不是最佳答案。请参见https://stackoverflow.com/a/35871564/307511
Chronial在下面给出了一个很好的例子来说明如何做出这个Assert。他的答案比我现在的代码更好。
测试用户是否登录的最直接方法是测试Client对象:
您还可以检查特定用户是否已登录:
作为附加信息,
response.request
对象不是HttpRequest
对象;相反,它是一个普通的dict,包含一些关于实际请求的信息,因此无论如何它都不会有user
属性。此外,测试
response.context
对象是不安全的,因为您并不总是拥有上下文。zwghvu4y3#
Django的TestClient有一个login方法,如果用户成功登录,则返回True。
wkyowqbh4#
User
模型上的is_authenticated()
方法总是返回True
。在request.user
是AnonymousUser
的示例的情况下,request.user.is_authenticated()
返回False
,而is_authenticated()
方法总是返回False
。在测试时,您可以查看response.context['request'].user.is_authenticated()
。您还可以尝试访问test中需要登录的另一个页面,并查看
response.status
是否返回200
或302
(从login_required
重定向)。7xzttuei5#
你在哪里初始化你的
self.client
?你的setUp
方法里还有什么?我有一个类似的测试,你的代码应该可以正常工作。下面是我的方法:如果我注解掉我的登录逻辑,在
self.client.post(
之后我就不会得到任何用户。如果你真的想检查用户是否通过了身份验证,使用self.client
来访问另一个需要用户身份验证的url。继续上面的操作,访问另一个页面:上面的代码应该返回200以确认用户已经通过了身份验证,否则,它将重定向到带有302代码的登录页面。
b5lpy0ml6#
还有另一种简洁的方法,在
response
中使用wsgi_request
:和@Chronial的方式也可用于
wsgi_request
:因为
response.wsgi_request
对象具有session
属性。不过,我认为使用
response.wsgi_request.user
更简单。