【问题标题】:Django Test form ValidationErrorDjango 测试表单 ValidationError
【发布时间】:2018-11-10 13:41:49
【问题描述】:

在我的应用程序中,我在 RegisterForm 中扩展了 UserCreationForm,并且我正在尝试测试如果密码 1 不等于密码 2,注册表是否返回 ValidationError。在每次测试尝试中,我都收到了AssertionError: ValidationError not raised

class RegisterViewTestCase(TestCase):

    def setUp(self):
        self.bad_data = {
            'email': self.email,
            'password1': 'valid_password1',
            'password2': 'valid_password2'
        }

    def test_register_registers_invalid_data(self):
        form = RegisterForm(self.bad_data)
        self.assertFalse(form.is_valid())

        with self.assertRaises(ValidationError):
            form.full_clean()

forms.py

class RegisterForm(UserCreationForm):

    class Meta:
        model = CustomUser
        fields = ['email']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['email'].widget.attrs.update({'autofocus': True})

任何线索为什么它没有通过测试?

【问题讨论】:

  • self.bad_data 是什么?我只看到self.data
  • 对不起,我编辑了:D
  • 您也可以添加您的表单吗?
  • 已添加,查看
  • 您的代码看起来不错。请尝试在您的 RegisterForm 类中添加一个 clean_password2,该类执行 super().clean_password2() 但这不是必需的...

标签: django django-forms django-testing


【解决方案1】:

问题来自于调用full_clean,它实际上并没有重新引发任何验证错误——而是由full_clean(包括_clean_fields -> UserCreationForm.clean_password2)调用的方法引发的任何错误都将被捕获并添加到表单的ErrorDict。 请注意,任何未通过验证的字段也不会显示在form.cleaned_data 中。

【讨论】:

  • 所以基本上我必须测试该方法以查找是否收到任何错误,我理解正确吗?
  • 是的,调用 form.clean_password2() 应该会引发您想要的错误。
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 2021-10-02
  • 1970-01-01
  • 2018-01-18
  • 2017-10-19
  • 2010-09-25
  • 2023-04-03
  • 2018-01-04
相关资源
最近更新 更多