当用作默认参数值时,Django factoryboy失败

时间:2016-04-04 08:44:22

标签: python django optional-parameters factory-boy

我有一组工厂,我在测试阶段通过名为Create的方便功能运行。当我需要引用现有项目时,我将其作为参数传递,如果不是我用FactoryBoy创建一个新项目:

def Create(project=ProjectFactory()):
    # do stuff with project

我正在调用函数:

Create() # new project will be defined
Create(existing_project) # existing project will be used

但它没有用,我有一堆错误:

E   ProgrammingError: relation "auth_user" does not exist
E   LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...
E                                                                 ^

尝试了几天不同的解决方法之后,我发现这个版本有效:

def Create(project=None):
    project = ProjectFactory() if not project else project
    # do stuff with project

对我来说,它做同样的事情,我在这里错过了什么?

1 个答案:

答案 0 :(得分:2)

请注意def Create(project=ProjectFactory()):中的默认参数在模块加载时绑定,基本上是在测试运行器启动时。由于测试运行器从头开始迁移测试数据库,因此无法在此时创建并保存Project

在第二个版本中

def Create(project=None):
    project = ProjectFactory() if not project else project

创建Project的代码位于函数内部,因此仅在调用函数后执行 - 迁移后运行。