【发布时间】:2014-05-01 13:05:16
【问题描述】:
如何防止 Django 单元测试运行 South 迁移?
我有一个自定义 Django 应用程序 myapp,我正在尝试使用 manage.py test myapp 进行测试,但是当我运行它时出现错误:
django.db.utils.OperationalError: table "myapp_mymodel" already exists
果然,回溯显示 South 正在被执行:
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/south/management/commands/test.py", line 8, in handle
super(Command, self).handle(*args, **kwargs)
但是,在我的设置中,我指定了:
SOUTH_TESTS_MIGRATE = 0
SKIP_SOUTH_TESTS = 1
我认为这应该会阻止 Django 的测试框架执行任何 South 组件。
我做错了什么?
编辑:我通过简单地删除南来解决这个问题:
if 'test' in sys.argv:
INSTALLED_APPS.remove('south')
但是,我得到了:
ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME value.
对于我的测试数据库设置,我使用的是:
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3'
}
}
在 Django 1.4 中运行良好。现在我使用的是 Django 1.5,我猜这不是 kosher。但是,没有 NAME 值我看到它来修复它。他们都报告说我的表都不存在。我试过了:
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/dev/shm/test.db',
'TEST_NAME': '/dev/shm/test.db',
}
}
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
'TEST_NAME': ':memory:',
}
}
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
'TEST_NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
}
}
每个似乎都创建了一个物理 test.db 文件,我不明白,因为单元测试应该在内存中运行。它永远不应该将任何内容保存到磁盘。据推测,它在创建文件之后但在执行实际的单元测试之前无法运行 syncdb。我该如何解决这个问题?
编辑:我发现,在我的一个表单中,我通过直接查询模型来填充字段选择(而我应该在表单的 init 中这样做),所以当 Django 的测试框架导入了我的模型,它试图在创建 sqlite3 数据库之前读取表。我解决了这个问题,但现在我收到了错误:
DatabaseError: table "myapp_mythroughmodel" already exists
所以我回到第一方,即使它抛出的异常类型与最初不同。
编辑:我定义了一个重复的模型,导致 Django 尝试创建它两次,导致错误。
【问题讨论】:
-
尝试使用显式布尔值:
SOUTH_TESTS_MIGRATE = False和SKIP_SOUTH_TESTS = True -
@stevejalim,没有变化...
标签: python django django-south django-unittest