web-dev-qa-db-ja.com

DjangoでFormsのテストを作成するにはどうすればよいですか?

Djangoでテストを書いているときに、ビューへのリクエストをシミュレートしたいと思います。これは主にフォームをテストするためです。ここに簡単なテストリクエストのスニペットがあります:

from Django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertEqual(response.status_code, 200) # we get our page back with an error

フォームエラーがあるかどうかにかかわらず、ページは常に200の応答を返します。フォームが失敗し、特定のフィールド(soemthing)にエラーがあったことを確認するにはどうすればよいですか?

98

フォームをテストするだけであれば、フォームがレンダリングされるビューではなく、フォームをテストするだけでよいと思います。アイデアを得るための例:

from Django.test import TestCase
from myapp.forms import MyForm

class MyTests(TestCase):
    def test_forms(self):
        form_data = {'something': 'something'}
        form = MyForm(data=form_data)
        self.assertTrue(form.is_valid())
        ... # other tests relating forms, for example checking the form data
230

https://docs.djangoproject.com/en/stable/topics/testing/tools/#Django.test.SimpleTestCase.assertFormError

from Django.tests import TestCase

class MyTests(TestCase):
    def test_forms(self):
        response = self.client.post("/my/form/", {'something':'something'})
        self.assertFormError(response, 'form', 'something', 'This field is required.')

ここで、「form」はフォームのコンテキスト変数名、「something」はフィールド名、「このフィールドは必須です」です。予想される検証エラーの正確なテキストです。

73
Shane

2011年の最初の回答は

self.assertContains(response, "Invalid message here", 1, 200)

しかし、私は今(2018)を見る 利用可能な適用可能なアサートの群集があります

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

好きなものを選んでください。

12
John Mee