我已经按照Django 文档中的程序使一些 Django-CMS 插件可重用,并按照Hitchhiker 的打包指南将它们放在 pypi 上,因此它们可以通过
pip install cmsplugin-rt
这会将它们安装在 python 可以找到它们的合理位置。当然,我在其他地方有我的开发目录。
但是当我向这个包添加一些测试时,我得到了错误:
django.core.exceptions.ImproperlyConfigured: App with label cmsplugin_rt could not be found
需要更多的解释。由于该包不是 Django 项目的一部分,即没有manage.py
用于运行测试的文件,因此我按照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 uninstall cmsplugin-rt
(如果这确实运行了,测试会使用我的包的开发版本运行,还是会从 pip 安装中提取版本?每次运行之前我需要吗?)
这是我的目录结构 - 我在一个包中有几个插件,这可能是问题的一部分。我把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
顶层放了一个空(按照这里的建议),但我不确定它有什么不同。