如何对 django url 进行单元测试?

问题描述 投票:0回答:3

除了我的

urls.py
之外,我的应用程序中的所有地方都实现了 100% 的测试覆盖率。对于如何为我的 URL 编写有意义的单元测试,您有什么建议吗?

FWIW 这个问题是在我尝试测试驱动开发时出现的,并且希望在编写代码来修复它们之前先进行失败的测试。

django unit-testing tdd django-urls
3个回答
82
投票

一种方法是

reverse
URL 名称并验证

示例

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/')

无论如何,您可能正在测试视图。

现在,要测试 URL 是否连接到正确的视图,您可以使用

resolve

from django.urls import resolve

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

现在在变量

resolver
ResolverMatch
类实例)中,您有以下选项

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

4
投票

只是补充@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)


0
投票

很抱歉成为一名矿工,但我在关键词“django url 测试”下发现了这个地方作为第一个。

我相当同意我的前辈的观点,但我也确信有更好的方法来测试你的 URL。我们不应该使用“resolver=resolve('url/path')”的主要原因是,当视图的名称更加固定时,路径在某种程度上是流畅的。

简单来说,这样更好:

class TestUrls(TestCase):

    def test_foo_url_resolves(self):
        url = reverse('bar:foo')
        self.assertEqual(resolve(url).func.view_class, FooBarView)

'bar:foo' - bar 是命名空间,foo 是视图名称

比这个

class TestUrls(TestCase):
    def test_resolution_for_foo(self):
        resolver = resolve('/api/v1/foo')
        self.assertEqual(resolver.func.cls, FooView)
© www.soinside.com 2019 - 2024. All rights reserved.