How do I unit test django urls?

后端 未结 2 1151
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-30 08:46

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 te

相关标签:
2条回答
  • 2021-01-30 09:13

    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'
    
    0 讨论(0)
  • 2021-01-30 09:18

    Just complementing the answer from @karthikr (on the basis of his)

    -> you may assert that the view in charge of resolve is the one you'd expect using resolver.func.cls

    example

    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 讨论(0)
提交回复
热议问题