【问题标题】:Django Unit tests for forms表单的 Django 单元测试
【发布时间】:2017-10-19 22:56:38
【问题描述】:

假设我有一个定义为:

class NumbersABForm(forms.Form):
    a = forms.FloatField(required=False)
    b = forms.FloatField(required=False)

    def clean(self):
        if self.cleaned_data['a'] < self.cleaned_data['b']:
            raise ValueError('a < b')

我想为这个表单定义单元测试用例如下:

class NumbersABFormTest(TestCase):
    def test_invalid(self):
        try:
            form = NumbersABForm({
                'a': 10.0,
                'b': 5.0
            })
            self.assertFalse(form.is_valid())
        except ValueError:
            self.assertEqual(form.errors, {'a < b'})

抛出异常但“form.errors”为空。我不明白这是如何工作的。此外,在调用 form.is_valid() 之前返回 False 之后,再次调用它会返回 True。我不知道这怎么可能。我有什么遗漏吗?

【问题讨论】:

    标签: django unit-testing django-forms


    【解决方案1】:

    您将ValueErrorValidationError 混淆了:

    from django.core.exceptions import ValidationError
    
    class NumbersABForm(forms.Form):
        a = forms.FloatField(required=False)
        b = forms.FloatField(required=False)
    
        def clean(self):
            if self.cleaned_data['a'] < self.cleaned_data['b']:
                raise ValidationError('a < b')
    

    你不应该试图抓住它,因为is_valid() 不应该引发它,而是在表单中添加一个错误:

    class NumbersABFormTest(TestCase):
        def test_invalid(self):
            form = NumbersABForm({
                'a': 10.0,
                'b': 5.0
            })
            self.assertFalse(form.is_valid())
            self.assertDictEqual(form.errors, {'__all__': 'a < b'})
    

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2012-03-20
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多