如何在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')
关键说明
- 默认verbose_name规则:如果模型字段没有显式指定
verbose_name,Django会自动将字段名的下划线替换为空格,比如short_url的默认标签是short url,而非原字段名字符串。 - 指定了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')
- 无需实例化模型:直接通过模型类的
_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
相关产品推荐
相关产品推荐

