djangounit-testingtdddjango-urls

How do I unit test django urls?


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.


Solution

  • 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'