Подтвердить что ты не робот

Проверить, что пользователь был успешно зарегистрирован

Как проверить, что пользователь зарегистрировался после отправки регистрационной формы?

Я попробовал следующее, но он возвращает 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
4b9b3361

Ответ 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 более простое.