How should I write tests for Forms in Django?

I'd like to simulate requests to my views in Django when I'm writing tests. This is mainly to test the forms. Here's a snippet of a simple test request:

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

The page always returns a response of 200 whether there's an form error or not. How can I check that my Form failed and that the particular field (soemthing) had an error?

65894 次浏览

The original 2011 answer was

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

但我现在看到(2018) 有一大堆可用的资产:

  • 信息
  • AssertFieldOutput
  • AssertFormError
  • AssertFormsetError

随你挑。

我认为如果您只想测试表单,那么您应该只测试表单,而不是呈现表单的视图。获得想法的例子:

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

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 need.”是预期验证错误的精确文本。