2020年9月20日日曜日

Djangoチュートリアル5での投票機能のテスト

DjangoでのPOSTのテスト

https://docs.djangoproject.com/ja/3.1/intro/tutorial05/#ideas-for-more-tests

Django公式チュートリアルの投票システムで、投票を実行した際のテストの記述を考える。

まず、新しいQuestionと、それに紐付く2件のChoiceを用意する。

  1. # 新しい質問と回答を2つ準備
  2. past_question = create_question(question_text='Past question.', days=-1)
  3. past_choice_one = create_choice(choice_text='Choice 1', question=past_question)
  4. past_choice_two = create_choice(choice_text='Choice 2', question=past_question)

まずは、単純にclient.postで、POSTデータを渡しつつURLを呼び出してみる。

  1. url = reverse('polls:vote', args=(past_question.id,))
  2.  
  3. # status_code=302が返ってくる
  4. response = self.client.post(url, {'choice' : past_choice_one.id})

この場合、レスポンスとしてはstatus_code=302が返って来る。

  1. self.assertEqual(response.status_code, 302)
  2. self.assertRedirects(
  3. response,
  4. reverse('polls:results', args=(past_question.id,)),
  5. status_code=302,
  6. target_status_code=200,
  7. msg_prefix='',
  8. fetch_redirect_response=True
  9. )

つまり、リダイレクト前のページ情報が取得されている。

参考:【Django】テストでリダイレクト先のページを検証する方法

https://qiita.com/kozakura16/items/c08b8cb8da12ace78658

リダイレクト先のページ内容まで検証する際は、client.post()メソッドの引数として、

follow=True

を渡してあげる。

  1. # 最終的なリダイレクト先のページ情報が返ってくる
  2. response = self.client.post(url, {'choice' : past_choice_one.id}, follow=True)

これにより、最終的にリダイレクトされたページがレスポンスに入るので、出力の検証コードが記述できるようになる。

  1. self.assertEqual(response.status_code, 200)
  2. self.assertContains(response, 'Choice 1 -- 1 vote')
  3. self.assertContains(response, 'Choice 2 -- 0 vote')
  4. self.assertEqual(response.context['question'].question_text, 'Past question.')
  5. self.assertQuerysetEqual(
  6. response.context['question'].choice_set.all(),
  7. ['<Choice: Choice 1>', '<Choice: Choice 2>'],
  8. ordered=False
  9. )

これは、公式ドキュメントの Testing Toolsページ内、getメソッドの項で触れられている。

https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.Client.get

0 件のコメント:

コメントを投稿