Django 测试 - NoReverseMatch

Posted

技术标签:

【中文标题】Django 测试 - NoReverseMatch【英文标题】:Django testing - NoReverseMatch 【发布时间】:2014-07-16 06:25:53 【问题描述】:

为什么这个测试不起作用?

这是我的views.py:

class ObjectDetailView(LoginRequiredMixin, DetailView):
    template_name = "object-detail.html"
    model = Object
    slug_field = 'username'

    def dispatch(self, request, *args, **kwargs):
        ....

urls.py:

url(r'^object/details/(?P<slug>[-\w.]+)/$', ObjectDetailView.as_view(), name='object-details'),

tests.py:

class ObjectViewsTestCase(TestCase):
    fixtures = ['/app/fixtures/object_fixture.json', ]

    def test_object_details(self):
        user = User.objects.get(id=1)
        self.client.login(username=user.username, password=user.password)
        resp = self.client.get(reverse('object-details', kwargs='slug': user.username))
        self.assertEqual(resp.status_code, 200)

我的错误:

NoReverseMatch:使用参数 '()' 和 找不到关键字参数''slug':u'admin''。尝试了 0 种模式: []

【问题讨论】:

【参考方案1】:

我在更新和删除视图时遇到了同样的问题。在我看来,您需要在请求中传递 PK ......就像这样:

    def test_service_delete_view(self):
        w = self.create_service()
        response = self.client.get(reverse('services:service-delete', kwargs='pk': w.pk))
        self.assertEqual(200, response.status_code)

【讨论】:

【参考方案2】:

您的设置中有ROOT_URLCONF 吗?如果是这样,请确保在运行测试时加载这些设置。或者您可以在测试中添加以下内容:

class ObjectViewsTestCase(TestCase):
    fixtures = ['/app/fixtures/object_fixture.json', ]
    urls = 'path.to.your.urls'  # for instance 'base.app.urls'

【讨论】:

以上是关于Django 测试 - NoReverseMatch的主要内容,如果未能解决你的问题,请参考以下文章

Django 单元测试 查看覆盖率

使用 Django 单元测试进行自动基准测试

python测试开发django-10.django连接mysql

Django 单元测试 - 无法创建 django_migrations 表

Django 测试技巧 [关闭]

django - 如何检测测试环境(检查/确定是不是正在运行测试)