はじめに
Djangoのテストをしようとしたが、views.pyの中で、
return redirect(reverse('menu:main'))
のようにしていると、テスト時に以下のようにHTTPのレスポンスコードを検証すると、エラーになる。
self.assertEqual(response.status_code, 200)
リダイレクトするときは一旦#302で一時ページが来てから最終的に#200でリダイレクト先のページというように返ってくるためである。
これを解消する方法を説明する(備忘録)。
テスト方法
TestCaseの以下のメソッドを用いる。
assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)
引数 | 意味 |
---|---|
response | GET/POSTしたレスポンス |
expected_url | 最終的にリダイレクトされるURL |
status_code | はじめに返ってくるHTTPのレスポンスコード |
target_status_code | 最終的に返ってくるHTTPのレスポンスコード |
msg_prefix | テスト結果のメッセージのプレフィックス |
fetch_redirect_response | 最終ページをロードするか否か |
テストコード例
tests.py
class AccountsAuthViewTests(TestCase):
def test_auth_success(self):
data = {
'username': 'test',
'password': 'password',
}
response = self.client.post(reverse('accounts:auth'), data)
self.assertRedirects(response, reverse('menu:main'), status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)
参考