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

能否在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:15:34