77

私のdjangoアプリには、認証システムがあります。そのため、ログインせずにプロファイルの個人情報にアクセスしようとすると、ログインページにリダイレクトされます。

次に、このためのテストケースを作成する必要があります。私が得るブラウザからの応答は次のとおりです。

GET /myprofile/data/some_id/ HTTP/1.1 302 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 301 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 200 6533

テストを書くにはどうすればよいですか?これは私がこれまでに持っているものです:

self.client.login(user="user", password="passwd")
response = self.client.get('/myprofile/data/some_id/')
self.assertEqual(response.status,200)
self.client.logout()
response = self.client.get('/myprofile/data/some_id/')

次に何が起こる可能性がありますか?

4

5 に答える 5

132

ジャンゴ 1.4:

https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertRedirects

ジャンゴ 2.0:

https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects

SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)

応答がstatus_codeリダイレクト ステータスを返し、 expected_url (すべてのGETデータを含む) にリダイレクトされ、最終ページがtarget_status_codeで受信されたことをアサートします。

リクエストでfollow引数を使用した場合、expected_urltarget_status_codeは、リダイレクト チェーンの最終ポイントの URL とステータス コードになります。

fetch_redirect_responseFalseの場合、最終ページは読み込まれません。テスト クライアントは外部 URL を取得できないため、expected_urlが Django アプリに含まれていない場合に特に便利です。

2 つの URL を比較する際に、スキームが正しく処理されるようになりました。リダイレクト先の場所にスキームが指定されていない場合は、元のリクエストのスキームが使用されます。存在する場合、 expected_urlのスキームが比較に使用されます。

于 2013-02-19T09:27:04.943 に答える
35

response['Location']予想される URL と一致するかどうかを確認できます。ステータス コードが 302 であることも確認します。

于 2013-02-19T06:45:04.130 に答える
13

response['Location']1.9には存在しません。代わりにこれを使用してください:

response = self.client.get('/myprofile/data/some_id/', follow=True)
last_url, status_code = response.redirect_chain[-1]
print(last_url)
于 2016-08-16T16:19:46.047 に答える