我应该如何在Django中为Forms编写测试?

Mri*_*lla 99 python django django-testing

我想编写测试时,我想在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
Run Code Online (Sandbox Code Playgroud)

无论是否存在表单错误,页面始终返回200的响应.如何检查我的表单失败以及特定字段(soemthing)是否有错误?

Tor*_*cht 238

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

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
Run Code Online (Sandbox Code Playgroud)

  • +1.**单位**测试的想法是分别测试每个单元. (60认同)
  • `self.assertEqual(form.is_valid(),True)`可以简化:`self.assertTrue(form.is_valid())` (18认同)
  • @wobbily_col它还需要更多时间来发现集成测试中的实际错误.在单元测试中它更明显.我认为,无论如何,你需要一个良好的测试覆盖率. (16认同)
  • @Daniel但集成测试更有用,更容易发现错误. (11认同)
  • 这是你检查特定表单错误的方法:```self.assertEquals(form.errors ['recipient'],[u"收件人无效"])``` (10认同)
  • 我喜欢做`self.assertTrue(form.isVald(),form.errors)` - 这可以确保测试失败消息包含表单无法验证的原因. (3认同)
  • @Danbiel当然.我认为它们非常适合某些功能单元,但很多时候人们似乎只是测试它们正在使用的框架/库.总的来说,我会说集成测试更有价值. (2认同)

小智 74

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.')
Run Code Online (Sandbox Code Playgroud)

其中"form"是表单的上下文变量名称,"something"是字段名称,"This field is required".是预期验证错误的确切文本.


Joh*_*Mee 12

最初的2011年答案是

self.assertContains(response, "Invalid message here", 1, 200)
Run Code Online (Sandbox Code Playgroud)

但我现在看到(2018年)有一大堆适用的断言:

  • assertRaisesMessage
  • assertFieldOutput
  • assertFormError
  • assertFormsetError

随便挑选.