除了我的
urls.py
之外,我的应用程序中的所有地方都实现了 100% 的测试覆盖率。对于如何为我的 URL 编写有意义的单元测试,您有什么建议吗?
FWIW 这个问题是在我尝试测试驱动开发时出现的,并且希望在编写代码来修复它们之前先进行失败的测试。
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/')
无论如何,您可能正在测试视图。
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'
只是补充@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)
很抱歉成为一名矿工,但我在关键词“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)