Невозможно перенаправить на @login_required URL в случае django_webtest - PullRequest
2 голосов
/ 11 февраля 2012

Я использую django_webtest для проверки своего приложения. Я столкнулся с проблемой при попытке проверить страницу регистрации. Эта страница должна создать пользователя и выполнить другие начальные действия, аутентифицировать вновь созданного пользователя и перенаправить его на страницу, указанную в параметре next запроса GET.

Вот код метода просмотра:

def _redirect_path(referrer, restricted_paths=()):
if not referrer or referrer in (reverse(name) for name in restricted_paths):
    return reverse('home')
else:
    return referrer

...

def sign_up(request):
if request.user.is_authenticated():
    return redirect(reverse('home'))
if request.method == 'POST':
    form = forms.SignUpForm(request.POST)
    if form.is_valid():
        with transaction.commit_on_success():
            user = form.save()
            profile = Profile.objects.create(user=user)
            tokens.create_token(profile, 'unsubscribe')
            mail.send_welcome_letter(request, user)
        messages.success(request, _('You have successfully signed up. Welcome!'))
        authenticated_user = auth.authenticate(username=user.username, password=form.cleaned_data['password'])
        if authenticated_user:
            auth.login(request, authenticated_user)
            remember_user(request, authenticated_user)
            redirect_path = _redirect_path(form.clean_referrer(), ('password_reset', 'sign_up'))
            return redirect(redirect_path)
        else:
            raise Exception("Newly created user couldn't be authenticated.")
else:
    referrer = request.GET.get('next')
    form = forms.SignUpForm(initial={'referrer': referrer})

return render_to_response('sign_up.html', {'form': form}, context_instance=RequestContext(request))

Теперь я пытаюсь проверить его поведение, когда пользователь ввел example.com/sign_up/?next=/settings/ в своем браузере, правильно заполните все поля формы и отправьте его.

Просмотреть, что обрабатывает / settings / имеет decorator @login_required, но после успешной регистрации пользователя он должен пройти аутентификацию, поэтому я ожидаю, что после отправки пользователь перейдет на example.com/settings/ (и он уйдет, когда я проверю это вручную).

Но когда я запускаю тест:

def test_user_creation_redirect_to_settings(self):
    form = self.app.get('/sign_up/', {'next': '/settings/'}).form
    self.fill_sign_up_form(form)
    submit_response = form.submit()
    self.assertRedirects(submit_response, '/settings/')

возвращает «AssertionError: Не удалось получить страницу перенаправления '/ settings /': код ответа был 302 (ожидается 200)». Когда я отлаживал, я видел, что * submit_response * действительно 302 НАЙДЕН с путем расположения / settings /. Но когда метод assertRedirects пытается получить целевую страницу, он снова сталкивается с перенаправлением - example.com/settings/ перенаправляет на example.com/login/?next=/settings/. Таким образом, пользователь не вошел в систему после отправки.

ОК, я попытался войти в него с помощью логина тестового клиента:

def test_user_creation_redirect_to_settings(self):
    form = self.app.get('/sign_up/', {'next': '/settings/'}).form
    self.fill_sign_up_form(form)
    submit_response = form.submit()

    submit_response.client.login(username='User', password='secret')

    self.assertRedirects(submit_response, '/settings/')

Но все так же. Кажется, этот метод не работает:

def test_user_creation_redirect_to_settings(self):
    form = self.app.get('/sign_up/', {'next': '/settings/'}).form
    self.fill_sign_up_form(form)
    submit_response = form.submit()

    inside = self.client.login(username='User', password='secret')
    print inside and 'Login successful in self client'
    print 'Authenticated: %s' % bool('_auth_user_id' in self.client.session)

    inside = submit_response.client.login(username='User', password='secret')
    print inside and 'Login successful in response client'
    print 'Authenticated: %s' % bool('_auth_user_id' in submit_response.client.session)

отпечатков

    Login successful in self client
    Authenticated: True
    Login successful in response client
    Authenticated: False

Не могли бы вы помочь мне понять, почему функциональность входа не работает в тестовом примере и как войти в систему пользователя перед перенаправлением.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

Вы пытались использовать следующий метод в своих тестах? Это следует за перенаправлениями.

form.submit().follow()
0 голосов
/ 12 ноября 2012

Это ошибка django-webtest, исправленная в django-webtest 1.5.3.

...