django_webtestを使用してアプリケーションをテストしています。サインアップページをテストしようとすると問題に直面しました。このページでは、ユーザーを作成し、その他の初期アクションを実行し、新しく作成されたユーザーを認証し、次の GET要求のパラメーターで指定されたページにリダイレクトする必要があります。ここでdjango_webtestの場合、@login_requiredのURLにリダイレクトできません
は、ビューのメソッドのコードです:ユーザがブラウザでexample.com/sign_up/?next=/settings/に入ったとき
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))
は今、私はその動作をテストしようとすると、フォームのすべてのフィールドを埋めます正しく提出してください。
デコレータ@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/')
"応答コードが302だった(200を予定)はAssertionErrorは:リダイレクトページを取得できませんでした '/設定/'"。私がデバッグしたとき、私は* 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/')
しかし、それでもまだ同じ:
OK、私はテストクライアントのログイン方法で彼にログインしようとしました。そうです、この方法は、作品ではありません。
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ログイン機能はテストケースとどのようにリダイレクトする前に、ユーザーにログインするには動作しない理由を私は理解する助けてもらえます。
ありがとうございます!
ありがとう、スパイク! * follow()*はクライアントの追加ログインなしで正しく動作します。私が理解したように、初期応答(302 FOUND)のステータスをチェックし、次にfollow()を呼び出して、このメソッド(200 OK、target url)によって返されたレスポンスのステータスとパスを確認する必要があります。再度、感謝します。 – Marboni
うれしい私は助けることができました! – Spike