1. ホーム
  2. python

Django : ページが目的の url にリダイレクトされたかどうかをテストする

2023-08-10 09:29:22

質問

私の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/')

次に来るのは何だろう?

どのように解決するのか?

Django 1.4です。

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

Django 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)

が返されたことを主張します。 ステータスコード にリダイレクトされ、リダイレクトステータスが 期待されるURL (あらゆる GET データを含む)、そして最終的なページが target_status_code .

もしあなたのリクエストが に従います。 引数を使った場合 期待されるURL ターゲットステータスコード は、リダイレクトチェーンの最終地点の url とステータスコードになります。

もし fetch_redirect_response 偽の の場合、最終ページはロードされません。テストクライアントは外部 URL を取得できないので、これは特に次のような場合に便利です。 期待されるURL が Django アプリの一部でない場合、特に役に立ちます。

2 つの URL の間で比較を行うとき、スキームは正しく処理されます。リダイレクト先の場所にスキームが指定されていなければ、元のリクエストのスキームが使われます。もし存在すれば 期待されるURL のスキームが比較対象として使われます。