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


109

テストを書いているときに、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)にエラーがあったことを確認するにはどうすればよいですか?

回答:


250

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

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

62
+1。ユニットテストの考え方は、各ユニットを個別にテストすることです。
ダニエルローズマン、2011

13
@ダニエルしかし、統合テストははるかに有用であり、バグをキャッチする可能性が高くなります。
wobbily_col 14

19
@wobbily_colまた、統合テストの実際のバグを特定するのに時間がかかります。ユニットテストでは、より明白です。ただし、テストカバレッジを良好にするためには、どちらも必要になると思います。
Torsten Engelbrecht 2014

11
これは、特定のフォームのエラーをチェックする方法である:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
エミルStenström

18
self.assertEqual(form.is_valid(), True)簡略化できます:self.assertTrue(form.is_valid())
Adam Taylor

76

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」はフィールド名、「This field is required」です。予期される検証エラーの正確なテキストです。


これによりAttibuteErrorが発生します:AttributeError: 'SafeUnicode' object has no attribute 'errors'
sbaechler

初心者ユーザーの場合:事前にユーザーを作成self.client.force_login(self.user)し、テストメソッドの最初の行として使用します。
sgauri 2018年

このpost()に問題があり、次のようにマルチパートとして送信する必要があることがわかりました。response= self.client.post( "/ form-url /"、data = {'name': 'test123' 、 'category':1、 'note': 'note123'}、content_type = django.test.client.MULTIPART_CONTENT)フォームを保存するときに空のインスタンスが取得できない場合は、ブラウザから送信されたリクエストを確認してください
Ghaleb Khaled

17

最初の2011年の答えは

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

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

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

好きなのを選びな。


+1これは、フィールドに関連付けられていない一般的なフォームエラーの場合に機能しました。
アーロンLelevier 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.