我如何对django网址进行单元测试?

时间:2013-09-24 16:25:37

标签: django unit-testing tdd django-urls

除了urls.py之外,我在我的应用程序中实现了100%的测试覆盖率。您对我如何为我的网址编写有意义的单元测试有任何建议吗?

FWIW这个问题出现了,因为我正在尝试使用测试驱动开发,并希望在编写代码来修复它们之前进行失败的测试。

2 个答案:

答案 0 :(得分:54)

一种方法是reverse网址名称并验证

实施例

urlpatterns = [
    url(r'^archive/(\d{4})/$', archive, name="archive"),
    url(r'^archive-summary/(\d{4})/$', archive, name="archive-summary"),
]

现在,在测试中

from django.urls import reverse

url = reverse('archive', args=[1988])
assertEqual(url, '/archive/1988/')

url = reverse('archive-summary', args=[1988])
assertEqual(url, '/archive-summary/1988/')

您可能正在测试视图。

现在,要测试网址是否连接到右侧视图,您可以使用resolve

from django.urls import resolve

resolver = resolve('/summary/')
assertEqual(resolver.view_name, 'summary')

现在在变量resolverResolverMatch类实例)中,您有以下选项

 'app_name',
 'app_names',
 'args',
 'func',
 'kwargs',
 'namespace',
 'namespaces',
 'url_name',
 'view_name'

答案 1 :(得分:0)

只需补充@karthikr的答案(基于他的答案)

->您可能会断言负责解决问题的视图就是您期望使用resolver.func.cls

的视图。

示例

from unittest import TestCase
from django.urls import resolve

from foo.api.v1.views import FooView


class TestUrls(TestCase):
    def test_resolution_for_foo(self):
        resolver = resolve('/api/v1/foo')
        self.assertEqual(resolver.func.cls, FooView)