为什么我的Django工厂函数在本地数据库中创建模型,而不是测试数据库?
我在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里去调用它。