为什么在运行单元测试时要导入两次django设置,创建两次测试数据库?



Django: 1.3;PyCharm: 1.5.3

更正

我正在为Django应用程序编写单元测试,该应用程序使用GEOS来保存Point对象。对于本地测试,我遵循了根据geojango文档定制Spatialite后端的每一步。

我遇到了一个GEOS_ERROR (GEOS_ERROR: Geometry必须是一个点或LineString)每当我试图创建和保存一个点对象的模型实例。很明显,在模型的get_or_create函数中确实传递了一个Point对象。并且在shell中可以毫无问题地保存相同的模型。

不用深入研究导致这个错误的代码,我发现每次运行单元测试时,Django都会导入设置,创建一个测试数据库并立即销毁该数据库,然后为最终会抛出错误的测试再次创建测试数据库。

Testing started at 5:09 PM ...<br />
Importing Django settings module settings
SpatiaLite version ..: 2.4.0    Supported Extensions:
    - 'VirtualShape'    [direct Shapefile access]
    - 'VirtualText'[direct CSV/TXT access]
    - 'VirtualNetwork   [Dijkstra shortest path]
    - 'RTree'       [Spatial Index - R*Tree]
    - 'MbrCache'        [Spatial Index - MBR cache]
    - 'VirtualFDO'      [FDO-OGR interoperability]
    - 'SpatiaLite'      [Spatial SQL - OGC]
PROJ.4 Rel. 4.7.1, 23 September 2009
GEOS version 3.3.0-CAPI-1.7.0Creating test database 'default'...
Destroying old test database 'default'...
SpatiaLite version ..: 2.4.0    Supported Extensions:
(same Spatialite settings again)
cannot start a transaction within a transaction
cannot rollback transaction - SQL statements in progress
Syncing...
Creating tables ...

我怀疑这是由PyCharm引起的。但是当我在终端shell中运行'python manage.py test'时,同样的过程被重复,并且抛出了同样的错误。

我检查了我的设置文件,但找不到为什么它提示自己被导入两次,为什么测试数据库被创建两次。所需的init_spatialite-2.*。创建Spatialite数据库的sql也在项目路径上。

任何建议将非常感谢!

:我被JetBrains告知,在runserver期间两次导入settings.py可以通过这个补丁或runserver——noreload来修复。http://code.djangoproject.com/changeset/15911

但是,对于测试任务,导入错误仍然存在。

这很可能是因为您在导入路径上同时拥有settings.py和包含包。因为设置可以在不同的模块(settings和myproject.settings)下导入,所以可以执行两次。

确保你总是使用DJANGO_SETTINGS_MODULE=settings而不是DJANGO_SETTINGS_MODULE=myproject。设置或从包含Settings .py

的目录中删除__init__.py文件

或者升级到django 1.4

最新更新