2012-02-11 1 views
2

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

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

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/ в своем браузере, заполните все поля формы правильно и представить его.

Просмотреть, что ручки/настройки/имеет декоратор @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: Не удалось загрузить страницу переадресации '/ Настройки /': код ответа был 302 (ожидался 200)". Когда я отлаживался, я видел, что * submit_response * действительно 302 НАЙДЕНО с указанием пути/настроек /. Но когда метод 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 

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

Спасибо!

ответ

4

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

form.submit().follow() 
+0

Спасибо, Спайк! * follow() * работает корректно без дополнительного входа в систему. Как я понял, теперь мне нужно проверить статус начального ответа (302 НАЙДЕНО), затем вызвать follow() и проверить статус и путь ответа, возвращаемого этим методом (200 OK, целевой URL). Еще раз спасибо. – Marboni

+0

Рад, что я могу помочь! – Spike

0

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