为什么我的Django工厂函数在本地数据库中创建模型,而不是测试数据库?

1 投票
1 回答
817 浏览
提问于 2025-04-18 04:34

我在Django项目里有一些测试需要创建几个模型并把它们保存到数据库里。我把创建实例的代码提取到了几个“工厂”函数中,这些函数放在一个单独的模块(.py文件)里,这样我就可以快速创建一组相关的模型等(所以才有了object.create()这样的东西)。这些函数很简单,大概长这样:

def foo_factory():
    return Foo.objects.create(
       bar="random data"
    )

def bar_factory(foo_inst=foo_factory())
    return Bar.objects.create(
        related=foo_inst
    )

当我运行测试时,调用这个功能的测试(在Django的TestCase类里面)把它们的模型实例保存到了我的本地开发数据库(这是我在本地设置文件里指定的),而不是自动创建的临时测试数据库。

测试大概是这样的:

TestFooThing(TestCase):
    def test_foo_stuff(self):
        foo_inst = foo_factory()
        self.assertTrue(foo_inst.blah)

我理解的是整个环境是根据测试环境的设置来启动的,但这个特定的情况似乎并不是这样。其他测试都能正常使用测试数据库。

我这里漏掉了什么呢?

详细信息:

  • Django 1.6

  • 使用django-nose运行测试

1 个回答

0

bar_factory里的参数foo_inst是在模块被导入的时候就被计算出来了。这个时候,通常数据库还是指向本地的开发数据库,而不是测试数据库。

你需要重新写这个默认值,让它在更晚的时候再计算。比如,不要直接传递实例,而是传递一个可以调用的东西,然后在你的bar_factory里去调用它。

撰写回答