能否在FactoryBoy中创建无需修改models.py的测试用人工模型?
测试场景下用FactoryBoy创建无需修改models.py的“人工”模型
完全可以做到,不用动项目里的models.py,FactoryBoy提供了几种方式来创建独立的“人工”模型实例,适配不同测试场景:
1. 无数据库依赖的模拟对象(适合单元测试)
如果你的测试不需要和数据库交互,只是需要一个和原SomeMod结构、行为一致的对象,直接在测试文件里定义一个模拟类,再用FactoryBoy的基础Factory来生成实例就行:
# 测试文件内定义,不用修改项目models.py class MockSomeMod: def __init__(self, title=None, description=None): self.title = title self.description = description def __str__(self): return self.title or "" # 对应的Factory类 class MockSomeModFactory(factory.Factory): class Meta: model = MockSomeMod # 用Faker自动生成测试数据,也可以写固定值 title = factory.Faker("sentence", nb_words=3) description = factory.Faker("paragraph", nb_sentences=2)
使用的时候直接调用:
# 生成一个实例 mock_obj = MockSomeModFactory() print(mock_obj.title) # 输出自动生成的标题
2. 基于测试数据库的临时Model(适合集成测试)
如果测试需要验证数据库操作(比如保存、查询),可以在测试文件里临时定义一个和原SomeMod结构一致的Django Model,搭配DjangoModelFactory使用。测试运行时会在测试专用数据库里创建表,测试结束后自动清理,完全不会影响生产环境的数据库和原models.py:
from django.db import models import factory # 测试文件内临时定义测试用Model class TestSomeMod(models.Model): title = models.CharField(max_length=255, blank=True, null=True) description = models.CharField(max_length=255, blank=True, null=True) def __str__(self): return self.title or "" # 对应的DjangoModelFactory class TestSomeModFactory(factory.django.DjangoModelFactory): class Meta: model = TestSomeMod # 可选:指定字段避免重复创建 django_get_or_create = ("title",) title = factory.Faker("sentence", nb_words=3) description = factory.Faker("paragraph", nb_sentences=2)
使用示例:
# 创建并保存到测试数据库 test_obj = TestSomeModFactory() assert TestSomeMod.objects.filter(title=test_obj.title).exists()
这两种方式都不用修改项目里的models.py,完全在测试代码里隔离实现,按需选择即可。
内容的提问来源于stack exchange,提问作者Hide856
相关产品推荐
相关产品推荐

