我应该如何在Django中编写有关Forms的测试?


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)是否存在错误?

Answers:


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。单元测试的思想是分别测试每个单元。
Daniel Roseman

13
@Daniel但是集成测试更有用,而且更有可能捕获错误。
wobbily_col 2014年

19
@wobbily_col它还需要花费更多时间来找出集成测试中的实际错误。在单元测试中它更为明显。我认为无论如何,您都需要一个良好的测试覆盖范围。
Torsten Engelbrecht 2014年

11
这是检查特定格式错误的方式:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"])
EmilStenström2014年

18
self.assertEqual(form.is_valid(), True)可以简化:self.assertTrue(form.is_valid())
亚当·泰勒

76

https://docs.djangoproject.com/zh-CN/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”是字段名称,而“此字段是必需的”。是预期验证错误的确切文本。


这就提出了一个AttibuteError对我来说:AttributeError的:“SafeUnicode”对象有没有属性“错误”
sbaechler

对于新手用户:预先创建一个用户,并self.client.force_login(self.user)用作测试方法的第一行。
sgauri

我对此post()遇到问题,然后我发现必须按以下响应分多次发送: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当它是未附加到字段的常规Form错误时,这对我有用。
亚伦·莱里维耶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.