How do I unit test django urls?

meshy picture meshy · Sep 24, 2013 · Viewed 19.4k times · Source

I have achieved 100% test coverage in my application everywhere except my urls.py. Do you have any recommendations for how I could write meaningful unit tests for my URLs?

FWIW This question has arisen as I am experimenting with Test-Driven Development and want failing tests before I write code to fix them.

Answer

karthikr picture karthikr · Sep 24, 2013

One way would be to reverse URL names and validate

Example

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

Now, in the test

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

You are probably testing the views anyways.

Now, to test that the URL connect to the right view, you could use resolve

from django.urls import resolve

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

Now in the variable resolver (ResolverMatch class instance), you have the following options

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