DjangoでのPOSTのテスト
https://docs.djangoproject.com/ja/3.1/intro/tutorial05/#ideas-for-more-tests
Django公式チュートリアルの投票システムで、投票を実行した際のテストの記述を考える。
まず、新しいQuestionと、それに紐付く2件のChoiceを用意する。
- # 新しい質問と回答を2つ準備
- past_question = create_question(question_text='Past question.', days=-1)
- past_choice_one = create_choice(choice_text='Choice 1', question=past_question)
- past_choice_two = create_choice(choice_text='Choice 2', question=past_question)
まずは、単純にclient.postで、POSTデータを渡しつつURLを呼び出してみる。
- url = reverse('polls:vote', args=(past_question.id,))
- # status_code=302が返ってくる
- response = self.client.post(url, {'choice' : past_choice_one.id})
この場合、レスポンスとしてはstatus_code=302が返って来る。
- self.assertEqual(response.status_code, 302)
- self.assertRedirects(
- response,
- reverse('polls:results', args=(past_question.id,)),
- status_code=302,
- target_status_code=200,
- msg_prefix='',
- fetch_redirect_response=True
- )
つまり、リダイレクト前のページ情報が取得されている。
参考:【Django】テストでリダイレクト先のページを検証する方法
https://qiita.com/kozakura16/items/c08b8cb8da12ace78658
リダイレクト先のページ内容まで検証する際は、client.post()メソッドの引数として、
follow=True
を渡してあげる。
- # 最終的なリダイレクト先のページ情報が返ってくる
- response = self.client.post(url, {'choice' : past_choice_one.id}, follow=True)
これにより、最終的にリダイレクトされたページがレスポンスに入るので、出力の検証コードが記述できるようになる。
- self.assertEqual(response.status_code, 200)
- self.assertContains(response, 'Choice 1 -- 1 vote')
- self.assertContains(response, 'Choice 2 -- 0 vote')
- self.assertEqual(response.context['question'].question_text, 'Past question.')
- self.assertQuerysetEqual(
- response.context['question'].choice_set.all(),
- ['<Choice: Choice 1>', '<Choice: Choice 2>'],
- ordered=False
- )
これは、公式ドキュメントの Testing Toolsページ内、getメソッドの項で触れられている。
https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.Client.get
0 件のコメント:
コメントを投稿