【问题标题】:Why are the django settings imported twice, and test database created twice when running unit-tests?为什么在运行单元测试时两次导入 django 设置,并创建两次测试数据库?
【发布时间】:2011-10-04 02:48:09
【问题描述】:

Django:1.3; PyCharm:1.5.3

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

每当我尝试使用 Point 对象创建和保存模型实例时,都会遇到 GEOS_ERROR(GEOS_ERROR:几何必须是 Point 或 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”时,重复了相同的过程并引发了相同的错误。

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

任何建议将不胜感激!

更新: JetBrains 告诉我,在 runserver 期间两次导入 settings.py 可以通过此补丁或 runserver --noreload 修复。 http://code.djangoproject.com/changeset/15911

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

【问题讨论】:

  • 我也很想看到对此的解释,因为我也注意到了这一点,尽管幸运的是到目前为止它还没有给我带来任何问题。
  • 这并没有导致我在测试应用程序中不需要使用 GEOS 支持/创建的几何列的其他模块时出现任何问题。所以我强烈怀疑由于这个数据库错误而无法保存几何字段,但我无法证明或测试它:(。
  • 这是(曾经?)一个已知问题,谷歌:django 设置导入了两次。我认为自从 Django 1.4 以来不再发生双重加载。
  • 我注意到 settings.py 确实在 1.4 及更高版本中加载了两次。

标签: django unit-testing sqlite pycharm


【解决方案1】:

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

只要确保您始终使用 DJANGO_SETTINGS_MODULE=settings 而不是 DJANGO_SETTINGS_MODULE=myproject.settings 或从包含 settings.py 的目录中删除 __init__.py 文件

或者,更好的是,升级到 django 1.4

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 2020-10-14
    • 2011-11-04
    • 2022-01-12
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多