Проверить, что пользователь был успешно зарегистрирован
Как проверить, что пользователь зарегистрировался после отправки регистрационной формы?
Я попробовал следующее, но он возвращает 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
Ответы
Ответ 1
Это не лучший ответ. См. fooobar.com/questions/142430/...
Chronial дал отличный пример того, как это сделать ниже. Его ответ лучше, чем у меня для сегодняшнего кода.
Самый простой способ проверить, зарегистрирован ли пользователь, - проверить объект 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
небезопасно, потому что у вас нет контекста.
Ответ 2
Вы можете использовать метод get_user
модуля auth
. Он говорит, что хочет, чтобы запрос был параметром, но он только использует атрибут session
запроса. И просто случается, что наш Client
имеет этот атрибут.
from django.contrib import auth
user = auth.get_user(self.client)
assert user.is_authenticated()
Ответ 3
Django TestClient имеет метод входа, который возвращает True, если пользователь был успешно зарегистрирован.
Ответ 4
Метод is_authenticated()
в модели User
всегда возвращает True
. False
возвращается для request.user.is_authenticated()
в случае, когда request.user
является экземпляром AnonymousUser
, метод is_authenticated()
всегда возвращает False
.
Во время тестирования вы можете посмотреть response.context['request'].user.is_authenticated()
.
Вы также можете попробовать получить доступ к другой странице в тесте, которая требует входа в систему, и посмотреть, возвращается ли response.status
200
или 302
(перенаправлять с login_required
).
Ответ 5
Где вы инициализируете свой 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.
Ответ 6
Существует еще один лаконичный путь, используя wsgi_request
в response
:
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
более простое.