1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Django][Python]FormViewのテスト作成

Posted at

FormViewとは

以下とか、
https://qiita.com/box16/items/23f78e1014f6dc8f849e
以下を参照してください
https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

FormViewのテスト

FormViewは、formに入力された値をチェックし、validならsuccess_urlにリダイレクトする

このリダイレクトがテスト作成において結構厄介だったので備忘録的に対処方法を描いてみる

まず、どんなアプリを想定しているかというと、以下
https://sample-apps.box16.site/morpholy/
image.png

入力文字列を形態素解析するというアプリ

実際に文字を入力し、出力項目を選択する
image.png

すると次のような結果が得られる
image.png

これをテストするには以下のようにテストケースを作る

tests.py
from django.test import TestCase
from django.urls import reverse


class IndexViewTests(TestCase):
    def test_full_post(self):
        url = reverse('morpholy:index')
        post_data = {
            "text": "大きな男の人に声をかける、素早い女の人",
            "select_part": ["名詞",
                            "動詞",
                            "形容詞"]}

        response = self.client.post(
            url, post_data, follow=True) # follow=Trueが重要

        self.assertContains(response, "名詞")
        self.assertContains(response, "")

        self.assertContains(response, "動詞")
        self.assertContains(response, "かける")

        self.assertContains(response, "形容詞")
        self.assertContains(response, "素早い")

まず、フォームと、フォームに入力する内容をディクショナリとして定義する
それを、postメソッドでpostする

FormViewはpostするとリダイレクトして、responseはリダイレクトの結果が入る
(例えば、status_codeが200ではなく307が返ってくるとか)

postメソッドで、follow=Trueとすると、リダイレクト先の結果が入る
(status_codeは200でresultviewの結果が出る)

後は、仕様に合わせてテストする

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?