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

Posted

技术标签:

【中文标题】为啥我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?【英文标题】:Why does my Django factory function create models in local DB, not test DB?为什么我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库? 【发布时间】:2014-06-13 21:21:11 【问题描述】:

我的 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】:

bar_factory 参数 foo_inst 在模块导入时进行评估。那个时候一般数据库还是指向本地的dev db,而不是test db。

您必须重写默认值,以便稍后对其进行评估。例如,不要传递实例,而是传递一个可调用对象并在您的 bar_factory 中调用它。

【讨论】:

以上是关于为啥我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在构造函数而不是 ngOnInit 中创建我的 Angular2 响应式表单?

在映射数据流(Azure 数据工厂)内的表达式函数中创建动态 Json

7中创建对象的方式(工厂模式构造函数模式原型模式动态原型模式等分析)

在 Django 模板中创建排序选项

为啥在 RegisterController 中创建函数在 laravel 中不起作用

为啥我不能在我的 H2 数据库中创建表?