【问题标题】:How to test Django-CMS plugins packaged as a reusable app如何测试打包为可重用应用程序的 Django-CMS 插件
【发布时间】:2013-02-12 15:45:45
【问题描述】:

我已按照Django docs 中的程序使一些 Django-CMS 插件可重用,并按照Hitchhiker's guide to packaging 将它们放在 pypi 上,因此它们可以通过

pip install cmsplugin-rt

这会将它们安装在 python 可以找到它们的合理位置。当然,我在其他地方有我的开发目录。

但是当我向这个包添加一些测试时,我得到了错误:

django.core.exceptions.ImproperlyConfigured: App with label cmsplugin_rt could not be found

需要更多解释。由于该包不是 Django 项目的一部分,即没有用于运行测试的 manage.py 文件,因此我遵循了 here at stackoverflow 的建议并将 runtests.py 添加到 tests 目录。特别是在我放的这个文件中:

import os, sys
from django.conf import settings

DIRNAME = os.path.dirname(__file__)
settings.configure(DEBUG=True,
    DATABASES={
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
         }
     },
    CMS_TEMPLATES = ( ('template_for_tests.html', 'Test template'), ),
    CMS_MODERATOR = False,
    CMS_PERMISSION = False,
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.contrib.auth.context_processors.auth',
        'django.core.context_processors.i18n',
        'django.core.context_processors.request',
        'django.core.context_processors.media',
        'django.core.context_processors.static',
        'cms.context_processors.media',
        'sekizai.context_processors.sekizai',
    ),
    INSTALLED_APPS = (
        'cmsplugin_rt.button',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.admin',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'south',
        'cms',
        'mptt',
        'menus',
        'sekizai',
    ),
)

from django.test.simple import DjangoTestSuiteRunner
test_runner = DjangoTestSuiteRunner(verbosity=2)
failures = test_runner.run_tests(['cmsplugin_rt', ])
if failures:
    sys.exit(failures)

所以,正如我所提到的,当我执行 python runtests.py 时,我得到了错误:

django.core.exceptions.ImproperlyConfigured: App with label cmsplugin_rt could not be found

我哪里错了?还是有更好的方法来做到这一点?我很想在那里做一些测试!

谢谢!

(如果确实运行了,测试会使用我的开发版本包运行,还是会从 pip 安装中提取版本?每次运行前我需要pip uninstall cmsplugin-rt 吗?)

这是我的目录结构 - 我在一个包中有几个插件,这可能是问题的一部分。正如您在此处看到的,我将tests 目录放在此处,尽管我也尝试过上一级。

cmsplugin-rt/
--README.txt
--LICENSE.txt
--MANIFEST.in
--setup.py
--cmsplugin_rt/
----__init__.py
----models.py
----button/
------__init__.py
------models.py
------cms_plugins.py
------templates/
----(other plugins)/
----tests/
------runtests.py
------mytests.py

为了安全起见,我还在顶层放置了一个空的models.py(按照here 的建议),但我不确定它有什么不同。

【问题讨论】:

  • 当我修改我的可重用应用程序时,我遇到了另一个问题 - 我如何使南迁移保持最新?我无法在上述目录中运行 ./manage.py schemamigration,因为没有 manage.py。目前我的工作是将目录(例如上面的按钮)复制到现有项目中,在那里使用 manage.py,然后复制迁移文件夹......一定有更好的方法!
  • 您是否尝试在 INSTALLED_APPS 中 cms 本身之后附加您的 cmsplugin ?
  • 有趣的问题!不,我有例如cmsplugin_rt.button 在 INSTALLED_APPS 中的 cms 之前...如果我在之后移动它,您期望有什么不同?

标签: python django unit-testing pip django-cms


【解决方案1】:

这里是我在第一条评论中提到的南方移民问题的解决方法。它不是很漂亮,所以我希望有任何关于如何改进它的建议。

cmsplugin_rt.button模型中添加新字段的过程是:

  1. 在进行任何编辑之前,将 site-packages/cmsplugin_rt/button 复制到一个虚拟的 Django-CMS 项目中,作为一个名为 button 的应用程序
  2. 删除此新应用的button/migrations/ 目录
  3. button 添加到虚拟项目settings.py 的INSTALLED_APPS
  4. 运行./manage.py schemamigration --init button,使虚拟项目对数据库的理解与当前模型保持一致(在进行任何更改之前)
  5. 运行./manage.py migrate button,更新虚拟项目的数据库
  6. 在虚拟项目中编辑按钮的model.py 文件以添加额外字段,并进行您需要的任何其他更改。
  7. 运行./manage.py schemamigration --auto button,生成迁移代码。这将在button/migrations/0002_auto__...
  8. 这个文件是你需要放入你的包中的,但是如果插件最初包含的不仅仅是0001_initial.py迁移文件,它前面的数字就会错误。使用正确的编号将其复制到您的包开发目录中。同时复制您所做的任何模型、cms_plugin、模板和其他更改。

【讨论】:

猜你喜欢
  • 2011-04-19
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2012-03-14
  • 2018-09-19
  • 2017-05-28
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多