【问题标题】:Django CMS test - can't find namespaceDjango CMS 测试 - 找不到命名空间
【发布时间】:2014-11-02 04:30:57
【问题描述】:

我在 Django CMS 测试中遇到了一个非常奇怪的问题。当我运行时:./manage.py test --settings=my_project.test_settings 我得到那个错误:

错误:test_guest_list_view (apps.news.tests.test_views.NewsListViewTest) 测试客人是否看不到 禁用条目 -------------------------------------------------- -------------------- Traceback(最近一次调用最后一次):文件 “/home/robert/work/projects/my_project/apps/news/tests/test_views.py”, 第 52 行,在 test_guest_list_view 响应 = self.client.get(self._get_list_url()) 文件“/home/robert/work/projects/my_project/apps/news/tests/test_views.py”, 第 17 行,在 _get_list_url 返回反向(“新闻:列表”)文件“/home/robert/.virtualenvs/my_project/local/lib/python2.7/site-packages/django/core/urlresolvers.py”, 第 532 行,反向 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)

和测试网址:

# -*- 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 apphook (http://django-cms.readthedocs.org/en/latest/extending_cms/testing.html)

我在该项目的不同应用程序中具有相同的测试模式,但它不会引发该错误。

【问题讨论】:

  • 我在这里有点困惑。你在测试一个apphook吗?如果是这样,您的 urls.py 中不应该有关于该应用程序的任何内容,对吧?
  • @mkoistinen 看看这个:django-cms.readthedocs.org/en/latest/extending_cms/… - 这就是我所做的。在我的 CMS 中,该应用程序是一个 apphook,但在我的测试中,我将其作为普通应用程序进行测试以检查其功能。
  • 问题是,当我运行所有测试时,我得到了那个错误。当我仅为该特定应用程序运行测试时 - 它通过了
  • 如果你使用 url(... app_name='news') 而不是 'namespace' 会怎样
  • 失败,即使在针对特定应用的测试中也是如此。

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


【解决方案1】:

我找到了解决方案。 正如Django CMS docs 中所建议的那样,我没有将@override_settings(ROOT_URLCONF='myapp.tests.urls') 用于我的TestCases,而是使用here 找到的Django 方式。

所以对于每个 TestCase 我都这样做,例如:

class NewsListViewTest(CMSTestCase):
    urls = 'apps.news.tests.urls'

【讨论】:

  • 链接无效
猜你喜欢
  • 2015-09-04
  • 2018-03-11
  • 1970-01-01
  • 2015-06-20
  • 2012-07-14
  • 2011-03-10
  • 2017-08-13
  • 2019-08-31
相关资源
最近更新 更多