如何为Django模型的image_url属性编写单元测试?
Django Project模型image_url属性测试指南
我是第一次写Django测试的开发者,需要为下面Project模型里的image_url属性编写测试。我自己拼了一段测试代码,但完全搞不懂逻辑,希望能拿到正确的测试代码,并且得到详细的解释。
原Project模型代码
class Project(models.Model): engineer = models.ForeignKey(Engineer, on_delete=models.CASCADE) name = models.CharField(max_length=100) tech_used = models.CharField(max_length=200) updated = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) image = models.ImageField(default="project.png") description = models.TextField(null=True, blank=True) repo_url = models.URLField(null=True, blank=True) live_url = models.URLField(null=True, blank=True) make_public = models.BooleanField(default=False) def __str__(self): return self.name @property def image_url(self): try: url = self.image.url except: url = "" return url class Meta: ordering = ["-created"]
我自己拼凑的测试代码
class TestModels(TestCase): def setUp(self): new_image = BytesIO() self.image = Project.objects.create( image=ImageFile(new_image) ) def test_image_url(self): self.assertEquals(self.image.image_url, '')
正确的测试代码
from django.test import TestCase from django.core.files.uploadedfile import SimpleUploadedFile from PIL import Image import io from .models import Project, Engineer class TestProjectModels(TestCase): def setUp(self): # 先创建关联的Engineer实例,解决Project外键依赖问题 self.engineer = Engineer.objects.create(name="测试工程师") # 准备空的无效测试图片 self.empty_image = SimpleUploadedFile( "empty.png", b"", content_type="image/png" ) # 准备有效的测试图片 img = Image.new('RGB', (100, 100), color='red') img_bytes = io.BytesIO() img.save(img_bytes, format='PNG') img_bytes.seek(0) self.valid_image = SimpleUploadedFile( "valid.png", img_bytes.read(), content_type="image/png" ) def test_image_url_with_default_image(self): # 测试使用默认图片时的image_url返回值 project = Project.objects.create( engineer=self.engineer, name="测试项目", tech_used="Python,Django" # 不指定image,自动使用默认值 ) self.assertNotEqual(project.image_url, "") self.assertIn("project.png", project.image_url) def test_image_url_with_empty_image(self): # 测试无效空图片的image_url返回值 project = Project.objects.create( engineer=self.engineer, name="测试项目2", tech_used="HTML,CSS", image=self.empty_image ) self.assertEqual(project.image_url, "") def test_image_url_with_valid_image(self): # 测试正常有效图片的image_url返回值 project = Project.objects.create( engineer=self.engineer, name="测试项目3", tech_used="React", image=self.valid_image ) self.assertNotEqual(project.image_url, "") self.assertIn("valid.png", project.image_url)
详细解释
1. 原代码的核心问题
- 缺少外键依赖:Project的
engineer是外键,不创建关联的Engineer实例直接生成Project,会触发数据库约束报错。 - 测试场景单一:只覆盖了无效图片的情况,没测默认图片和正常上传的场景。
- 变量命名混乱:
self.image实际是Project实例,命名容易混淆,可读性差。
2. 正确测试代码的关键逻辑
setUp方法
- 提前创建Engineer实例:解决外键依赖,确保Project能正常保存。
- 准备两种测试图片:空图片模拟无效上传,有效图片模拟正常场景,避免重复代码。
三个测试场景
- 默认图片场景:验证当不指定image时,
image_url能正确返回默认图片的URL。 - 无效图片场景:验证当图片文件损坏/为空时,
image_url能捕获异常并返回空字符串。 - 有效图片场景:验证正常上传图片时,
image_url能正确返回图片的访问路径。
内容的提问来源于stack exchange,提问作者osahenru
相关产品推荐
相关产品推荐

