Django CMS 测试 - 找不到命名空间
我在使用Django CMS进行测试时遇到了一个很奇怪的问题。当我运行命令:./manage.py test --settings=my_project.test_settings
时,出现了以下错误:
错误:test_guest_list_view (apps.news.tests.test_views.NewsListViewTest) 测试访客是否看不到 被禁用的条目 ---------------------------------------------------------------------- 回溯(最近的调用最后): 文件 "/home/robert/work/projects/my_project/apps/news/tests/test_views.py", 第52行,在test_guest_list_view response = self.client.get(self._get_list_url()) 文件 "/home/robert/work/projects/my_project/apps/news/tests/test_views.py", 第17行,在_get_list_url return reverse("news:list") 文件 "/home/robert/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/core/urlresolvers.py", 第532行,在reverse key) NoReverseMatch: u'news' 不是一个注册的命名空间
但是当我只对那个应用运行测试时,一切都正常 - 所有测试都通过了。
这是我目前非常简单的测试类:
# -*- coding: utf-8 -*-
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.test.utils import override_settings
from cms.test_utils.testcases import CMSTestCase
from apps.accounts.tests.factories import CustomUserFactory
from .factories import NewsFactory
from ..models import News
class BaseNewsTestCase(CMSTestCase):
def _get_list_url(self):
"""Returns URL to objects list"""
return reverse("news:list")
def _create_data_structure(self):
"""Created test data"""
# add objects
self.disabled = NewsFactory(is_visible=False)
self.enabled = NewsFactory()
NewsFactory()
NewsFactory()
self.user = CustomUserFactory(username='user', password='user')
# privileged_user
self.privileged_user = CustomUserFactory(username='p_user',
password='p_user')
# add permissions
content_type = ContentType.objects.get_for_model(News)
permissions_list = ('add_news', 'change_news', 'delete_news')
permissions = Permission.objects.filter(content_type=content_type,
codename__in=permissions_list)
self.privileged_user.user_permissions.add(*permissions)
@override_settings(ROOT_URLCONF='apps.news.tests.urls')
class NewsListViewTest(BaseNewsTestCase):
def test_guest_list_view(self):
"""Tests if guest can't see disabled entries"""
self._create_data_structure()
response = self.client.get(self._get_list_url())
objects = response.context['object_list']
self.assertEqual(len(objects), 3)
for obj in objects:
self.assertNotEqual(obj, self.disabled)
还有测试的URL:
# -*- coding: utf-8 -*-
from django.contrib import admin
from django.conf.urls import url, patterns, include
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls)),
url(r'^news/', include('apps.news.urls', namespace='news')),
url(r'', include('cms.urls')),
)
有没有人知道是什么导致了这个问题?我按照这个链接来测试我的CMA应用钩子(http://django-cms.readthedocs.org/en/latest/extending_cms/testing.html)
我在这个项目的不同应用中有相同的测试模式,但没有出现这个错误。
1 个回答
我找到了解决办法。
我没有像Django CMS文档中建议的那样,使用 @override_settings(ROOT_URLCONF='myapp.tests.urls')
来处理我的测试案例。相反,我采用了Django推荐的方式,具体可以在这里找到。
所以对于每个测试案例,我这样做,比如:
class NewsListViewTest(CMSTestCase):
urls = 'apps.news.tests.urls'