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

Ant*_*nov 7 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)
Run Code Online (Sandbox Code Playgroud)

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

你测试表格的做法是什么?在我看来,我上面所做的是错误的,因为它更多的是一个集成测试,通过视图来获取表单.

fal*_*tru 6

直接在测试中创建表单,并调用is_valid方法(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'])])
Run Code Online (Sandbox Code Playgroud)

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


BTW,参数assertTemplateUsedresponse, template_name, ...,不是template_name, response, .....

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

self.assertTemplateUsed(response, 'example.html')
Run Code Online (Sandbox Code Playgroud)