【问题标题】:How to test custom Django forms clean/save methods?如何测试自定义 Django 表单清理/保存方法?
【发布时间】:2014-11-14 05:35:22
【问题描述】:

大多数时候我必须更改/扩展默认的表单保存/清理方法。 但是我不太确定如何测试自定义保存/清理方法。

大多数时候我的测试是这样的:

response = self.client.post(reverse('example:view_name'), kwargs={'example, self.example'})
self.assertEqual(200, response.status_code)
self.assertTemplateUsed('example.html', response)

使用 Django 的 TestCase 类中的 self.client.post 来捕获响应是不够的,而且绝对不能覆盖/测试自定义保存和清理。

您测试表单的做法是什么?在我看来,我上面所做的事情是错误的,因为它更像是一个通过视图到达表单的集成测试。

【问题讨论】:

  • 你想测试什么?您可以检查输出是否符合您的预期(即:它保存了正确的数据)。

标签: python django unit-testing django-forms


【解决方案1】:

直接在测试中创建表单,调用is_valid method(clean被is_valid调用);检查它是否正确验证。 save 方法也一样。

例如:

from django.contrib.auth.forms import (UserCreationForm, ...)

...

class UserCreationFormTest(TestCase):

    def test_user_already_exists(self):
        data = {
            'username': 'testclient',
            'password1': 'test123',
            'password2': 'test123',
        }
        form = UserCreationForm(data)
        self.assertFalse(form.is_valid())
        self.assertEqual(
            form["username"].errors,
            [force_text(User._meta.get_field('username').error_messages['unique'])])

(以上代码来自django源代码-django/contrib/auth/tests/test_forms.py)。


顺便说一句,assertTemplateUsed 的参数是response, template_name, ...,而不是template_name, response, ....。

问题中代码的最后一行应该是:

self.assertTemplateUsed(response, 'example.html')

【讨论】:

  • 谢谢!所以唯一的办法就是通过 is_valid :/
  • 您会想要检查任何自定义验证工作,但我不会费心测试正常验证。如果您有自定义保存方法,您也需要对其进行测试:这需要使用result = form.save(),然后检查保存方法中发生的任何情况。
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 2010-11-26
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2012-07-06
相关资源
最近更新 更多