如何测试自定义Django表单清理/保存方法?

时间:2014-09-19 15:08:21

标签: python django unit-testing django-forms

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

大部分时间我的测试都是这样的:

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来捕获响应是不够的,绝对不会覆盖/测试自定义保存和清理。

您测试表格的做法是什么?在我看来,我上面所做的是错误的,因为它更多的是一个整合测试,通过视图来获取形式。

1 个答案:

答案 0 :(得分:6)

直接在测试中创建表单,然后调用is_valid methodis_valid调用clean);检查它是否正确验证。 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')