You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:40:38