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

use*_*695 4 python regex django validation unit-testing

我在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
Run Code Online (Sandbox Code Playgroud)

测试:

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')))
Run Code Online (Sandbox Code Playgroud)

此测试实际上创建了一个针对验证器规则和test_insertion实际传递的组织对象,但不应该是这种情况,并且应该在setUp本身中引发异常.

fal*_*tru 6

保存对象不会验证.您需要使用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)
Run Code Online (Sandbox Code Playgroud)

请参阅验证对象 - 模型实例引用| Django文档| Django的

顺便说一句,你的模型没有location字段.我相应地稍微修改了模型实例创建部分.