2

我正在使用django_webtest来测试我的应用程序。尝试测试注册页面时遇到问题。该页面应该创建用户并进行其他初始操作,验证新创建的用户并将其重定向到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/的视图有装饰器@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 FOUND 位置路径 /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)

印刷

    在自己的客户端登录成功
    认证:真
    响应客户端登录成功
    认证:假

您能否帮助我理解为什么登录功能在测试用例中不起作用以及如何在重定向之前登录用户。

谢谢!

4

2 回答 2

4

您是否尝试过在测试中使用以下方法?这样做会遵循重定向。

form.submit().follow()
于 2012-02-11T14:59:37.843 回答
0

这是 django-webtest 1.5.3 中修复的 django-webtest 错误。

于 2012-11-12T18:26:11.327 回答