Django模型的正则表达式验证器单元测试通过

6 投票
1 回答
2404 浏览
提问于 2025-04-18 14:51

我在models.py里定义了我的模型,并为一些字段设置了正则表达式验证器。在tests.py中,我写了一些测试来验证这些验证器,但测试却通过了。虽然当我通过视图输入错误值时,验证器会发出警告,但我在forms.py中并没有为那个表单写任何“清理”函数。

模型:

class Organization(models.Model):
    name = models.CharField(
                    max_length=128,
                    unique=True,
                    validators=[
                            RegexValidator(
                                    r'^[(A-Z)|(a-z)|(\s)]+$',
                            )   
                    ]   
            )   
    def __unicode__(self):
            return self.name

测试:

class TestOrganization(TestCase):
    def setUp(self):
            Organization.objects.create(
                    name='XYZ123',
                    location='ABC'
            )   

    def test_insertion(self):
            self.assertEqual(1,len(Organization.objects.filter(name='XYZ123')))

这个测试实际上是创建了一个组织对象,违反了验证器的规则,而test_insertion却通过了,这本来不应该这样,应该在setUp阶段就抛出异常。

1 个回答

8

保存对象的时候不会自动验证。你需要手动使用 Model.full_clean 方法来进行验证。

from django.core.exceptions import ValidationError

class TestOrganization(TestCase):
    def test_validation(self):
        org = Organization(name='XYZ123')
        with self.assertRaises(ValidationError):
            # `full_clean` will raise a ValidationError
            #   if any fields fail validation
            if org.full_clean():
                org.save()

        self.assertEqual(Organization.objects.filter(name='XYZ123').count(), 0)

可以查看 验证对象 - 模型实例参考 | Django 文档 | Django 来了解更多信息。

顺便说一下,你的模型里没有 location 这个字段。我稍微调整了一下模型实例创建的部分。

撰写回答