Подтвердить что ты не робот

Как я unit test URL-адреса django?

Я достиг 100% -ного охвата тестирования в своем приложении везде, кроме my urls.py. Есть ли у вас рекомендации относительно того, как я мог бы писать значимые модульные тесты для своих URL-адресов?

FWIW Этот вопрос возник, поскольку я экспериментирую с Test-Driven Development и хочу пропустить тесты перед тем, как написать код, чтобы исправить их.

4b9b3361

Ответ 1

Один из способов - 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'

Ответ 2

Просто дополняю ответ от @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)