116

テストを書いているときに、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フォームが失敗したこと、および特定のフィールド ( ) にエラーがあったことを確認するにはどうすればよいですか?

4

3 に答える 3

264

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

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
于 2011-09-05T06:50:23.130 に答える
82

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.')

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

于 2011-09-05T20:19:51.257 に答える
19

元の2011年の答えは

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

しかし、今(2018年)には、利用可能な適用可能なアサーションがたくさんあります

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

好きなのを選びな。

于 2011-09-05T06:18:07.640 に答える