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

Posted

技术标签:

【中文标题】我应该如何在 Django 中为表单编写测试?【英文标题】:How should I write tests for Forms in Django? 【发布时间】:2011-11-10 09:07:53 【问题描述】:

我想在编写测试时在 Django 中模拟对我的视图的请求。这主要是为了测试表格。这是一个简单测试请求的 sn-p:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

+1。 unit 测试的想法是分别测试每个单元。 @Daniel 但是集成测试更有用,也更有可能发现错误。 @wobbily_col 发现集成测试中的实际错误也需要更多时间。在单元测试中它更明显。我认为为了获得良好的测试覆盖率,无论如何你都需要它们。 这是检查特定表单错误的方式:self.assertEquals(form.errors['recipient'], [u"That recipient isn't valid"]) self.assertEqual(form.is_valid(), True) 可以简化为:self.assertTrue(form.is_valid())【参考方案2】:

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”是字段名称,“此字段是必需的”。是预期验证错误的确切文本。

【讨论】:

这为我引发了一个 AttibuteError:AttributeError: 'SafeUnicode' object has no attribute 'errors' 对于新手用户:预先创建一个用户并使用self.client.force_login(self.user)作为测试方法的第一行。 我对这个 post() 有一个问题,然后我发现我必须将它作为多部分发送,如下响应 = self.client.post("/form-url/", data= 'name': 'test123', 'category': 1, 'note': 'note123' , content_type=django.test.client.MULTIPART_CONTENT) 如果在保存表单时遇到空实例,请检查请求从浏览器发送【参考方案3】:

2011 年的原始答案是

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

但我现在看到了(2018 年)there is a whole crowd of applicable asserts available:

assertRaisesMessage assertFieldOutput assertFormError assertFormsetError

任你选。

【讨论】:

以上是关于我应该如何在 Django 中为表单编写测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 管理员中为模型字段使用自定义表单字段?

如何在django中为问题添加多个表单字段类型的选项?

如何在“单元测试”中为按钮添加点击操作并显示警报

Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号

如何在 Django Rest Framework 的 REST API 中为数组数据编写序列化程序?

在 Django 中为随机单词赋值