Django模型的正则表达式验证器单元测试通过
我在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
这个字段。我稍微调整了一下模型实例创建的部分。