如何在Django 1.11中测试auto_now_add字段功能
如何为Django 1.11 User模型的注册日期功能编写单元测试
嘿,我来帮你搞定这个注册日期的单元测试!先看你的模型和工厂代码,registration_date用了auto_now_add=True自动生成创建时间,还有一个get_registration_date方法,结合django-boy的工厂,咱们可以写出简洁又靠谱的测试。
核心测试思路
咱们要验证两个关键点:
- 用户创建时,
registration_date会自动被设置为当前时间(误差范围内) get_registration_date方法能正确返回这个日期值
完整测试代码
from django.test import TestCase from django.utils import timezone from your_app_name.factories import UserFactory from your_app_name.models import User class UserRegistrationDateTests(TestCase): def test_registration_date_is_auto_set_on_user_creation(self): # 记录用户创建前的时间点 pre_creation_time = timezone.now() # 用工厂快速创建用户(不用手动填姓名参数) user = UserFactory() # 记录用户创建后的时间点 post_creation_time = timezone.now() # 验证注册日期落在创建前后的时间区间内 self.assertLessEqual(pre_creation_time, user.registration_date) self.assertLessEqual(user.registration_date, post_creation_time) # 验证get_registration_date方法返回正确的日期 self.assertEqual(user.get_registration_date(), user.registration_date) def test_registration_date_is_recent(self): # 另一种更灵活的验证方式:确保注册日期是最近10秒内生成的 user = UserFactory() time_diff = timezone.now() - user.registration_date self.assertLess(time_diff, timezone.timedelta(seconds=10))
一些补充说明
- 时区问题:一定要用
django.utils.timezone.now()而不是Python原生的datetime.now(),这样能和Django模型中存储的时区一致,避免跨时区测试失败。 - 工厂优化:你的
UserFactory目前没给first_name和last_name设默认值,建议补充Faker生成假数据,这样创建用户时不用手动传参:
# factories.py import factory from factory.faker import Faker from your_app_name.models import User class UserFactory(factory.DjangoModelFactory): class Meta: model = User first_name = Faker('first_name') last_name = Faker('last_name')
- 测试执行:直接用Django自带的测试命令运行即可:
python manage.py test your_app_name.tests
内容的提问来源于stack exchange,提问作者user9192656
相关产品推荐
相关产品推荐

