测试未在Django模型字段上引发ValidationError
我有一个基本的模型字段验证器,如果上传的文件扩展名不在一个固定的列表里,就会抛出一个验证错误。
这个模型表单只会从管理的角度使用。但是在我的测试中,即使我输入了一个无效的文件扩展名,异常也没有被抛出。我到底哪里做错了呢?
验证器:
import os
from django.core.exceptions import ValidationError
def validate_file_type(value):
accepted_extensions = ['.png', '.jpg', '.jpeg', '.pdf']
extension = os.path.splitext(value.name)[1]
if extension not in accepted_extensions:
raise ValidationError(u'{} is not an accepted file type'.format(value))
模型:
from agency.utils.validators import validate_file_type
from django.db import models
from sorl.thumbnail import ImageField
class Client(models.Model):
"""
A past or current client of the agency.
"""
logo = ImageField(
help_text='Please use jpg (jpeg) or png files only. Will be resized \
for public display.',
upload_to='clients/logos',
default='',
validators=[validate_file_type]
测试:
from django.test import TestCase
import tempfile
import os
from settings import base
from clients.models import Client
class ClientTest(TestCase):
def setUp(self):
tempfile.tempdir = os.path.join(base.MEDIA_ROOT, 'clients/logos')
tf = tempfile.NamedTemporaryFile(delete=False, suffix='.png')
tf.close()
self.logo = tf.name
Client.objects.create(
name='Coca-Cola',
logo=self.logo,
website='http://us.coca-cola.com/home/'
)
def test_can_create_client(self):
client = Client.objects.get(name='Coca-Cola')
expected = 'Coca-Cola'
self.assertEqual(client.name, expected)
def tearDown(self):
os.remove(self.logo)
clients = Client.objects.all()
clients.delete()
1 个回答
16
请查看关于模型验证器的文档:
注意,当你保存一个模型时,验证器不会自动运行。
你需要手动调用它们:
client = Client(
name='Coca-Cola',
logo=self.logo,
website='http://us.coca-cola.com/home/'
)
client.full_clean()
client.logo = '#something invalid'
self.assertRaises(ValidationError, client.full_clean))