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

如何在Django中编写单元测试验证模型字段标签?

问题描述

我编写了如下model.py代码:

from django.db import models

class Url(models.Model):
    short_url = models.CharField(max_length=255)
    original_url = models.CharField(max_length=255)
    clicks = models.IntegerField(default=0)
    created_at = models.DateTimeField('date created', auto_now_add=True)
    updated_at = models.DateTimeField('date updated', auto_now=True)

class Click(models.Model):
    url = models.ForeignKey(Url, on_delete=models.CASCADE, related_name='related_clicks')
    browser = models.CharField(max_length=255)
    platform = models.CharField(max_length=255)
    created_at = models.DateTimeField('date created', auto_now_add=True)
    updated_at = models.DateTimeField('date updated', auto_now=True)

同时在tests/test_models.py中有如下测试代码:

from django.test import TestCase
from heyurl.models import Url, Click
from heyurl.views import short_url


class TestModels(TestCase):
    @classmethod
    def setupTestdata(cls):
        Url.objects.create(short_url='eOlKf', original_url='https://www.google.com', clicks= 2)
    
   #Figuring out how to test each label
    def test_short_url_label(self):
        field_label = Url.objects.get()
        self.assertEqual(field_label, 'short_url')

我希望在test_models.py中通过单元测试验证模型的字段标签,请问应替换上述test_short_url_label方法中的field_label为哪些代码,才能使用assertEqual进行断言验证?


解决方案

要验证模型字段的标签,需要通过模型的_meta属性获取字段对象,再读取其verbose_name值。修改后的test_short_url_label方法如下:

def test_short_url_label(self):
    # 直接通过模型类的_meta属性获取字段对象
    field_label = Url._meta.get_field('short_url').verbose_name
    # Django会自动将下划线字段名转为空格,所以断言值是'short url'
    self.assertEqual(field_label, 'short url')

关键说明

  1. 默认verbose_name规则:如果模型字段没有显式指定verbose_name,Django会自动将字段名的下划线替换为空格,比如short_url的默认标签是short url,而非原字段名字符串。
  2. 指定了verbose_name的字段测试:对于像created_at这种手动设置了标签的字段,测试逻辑可以直接断言指定值:
def test_created_at_label(self):
    field_label = Url._meta.get_field('created_at').verbose_name
    self.assertEqual(field_label, 'date created')
  1. 无需实例化模型:直接通过模型类的_meta属性就能获取字段信息,不需要先查询数据库获取实例,测试效率更高。

修正后的完整测试类示例

class TestModels(TestCase):
    @classmethod
    def setUpTestData(cls):
        # 注意:Django测试类的方法名是驼峰式的setUpTestData,原代码拼写有误
        Url.objects.create(short_url='eOlKf', original_url='https://www.google.com', clicks=2)
    
    def test_short_url_label(self):
        field_label = Url._meta.get_field('short_url').verbose_name
        self.assertEqual(field_label, 'short url')

    def test_original_url_label(self):
        field_label = Url._meta.get_field('original_url').verbose_name
        self.assertEqual(field_label, 'original url')

    def test_created_at_label(self):
        field_label = Url._meta.get_field('created_at').verbose_name
        self.assertEqual(field_label, 'date created')

内容的提问来源于stack exchange,提问作者shuberman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:30:56