Django UrlResolver, добавление URL во время выполнения для тестирования - PullRequest
28 голосов
/ 04 февраля 2011

Я собираюсь провести несколько тестов и пока не совсем знаком с URLResolver, но я бы хотел быстро решить эту проблему.

В TestCase я хотел бы добавить URL-адрес для распознавателя, чтобы я мог затем использовать Client.get('/url/') и отделить его от urls.py.

Ответы [ 4 ]

32 голосов
/ 05 августа 2015

Поскольку Django 1.8 использование django.test.TestCase.urls устарело Вы можете использовать django.test.utils.override_settings вместо:

from django.test import TestCase
from django.test.utils import override_settings

urlpatterns = [
    # custom urlconf
]

@override_settings(ROOT_URLCONF=__name__)
class MyTestCase(TestCase):
    pass

override_settings может применяться как ко всему классу, так и к определенному методу.

25 голосов
/ 09 ноября 2011

https://docs.djangoproject.com/en/2.1/topics/testing/tools/#urlconf-configuration

В вашем тесте:

class TestMyViews(TestCase):
     urls = 'myapp.test_urls'

Это будет использовать myapp/test_urls.py как ROOT_URLCONF.

6 голосов
/ 05 декабря 2013

Я знаю, что об этом спрашивали некоторое время назад, но я подумал, что отвечу еще раз, чтобы предложить что-то более полное и современное.

У вас есть два варианта решения этой проблемы, один из которых заключается в том, чтобы предоставить свой собственный файл URL-адресов, как следует из ответа SystemParadox:

class MyTestCase(TestCase):
    urls = 'my_app.test_urls'

Другой способ - обезьяна исправить ваши URL. Это НЕ рекомендуемый способ работы с переопределенными URL-адресами, но вы можете оказаться в ситуации, когда вам все еще это нужно. Чтобы сделать это для одного тестового случая, не влияя на остальные, вы должны сделать это с помощью метода setUp(), а затем выполнить очистку с помощью метода tearDown().

import my_app.urls
from django.conf.urls import patterns

class MyTestCase(TestCase):
    urls = 'my_app.urls'

    def setUp(self):
        super(MyTestCase, self).setUp()
        self.original_urls = my_app.urls.urlpatterns
        my_app.urls.urlpatterns += patterns(
            '',
            (r'^my/test/url/pattern$', my_view),
        )

    def tearDown(self):
        super(MyTestCase, self).tearDown()
        my_app.urls.urlpatterns = self.original_urls

Обратите внимание, что это не будет работать, если вы пропустите атрибут класса urls. Это связано с тем, что в противном случае URL-адреса будут кэшироваться, а исправление обезьяны не вступит в силу, если вы запустите свой тест вместе с другими тестами.

1 голос
/ 12 февраля 2019

Не удалось запустить его с ответами выше.Даже с override_settings.Нашел решение, которое работает для меня.Мой пример использования заключался в написании некоторых интеграционных тестов, в которых я хотел бы протестировать методы put / post, где мне были нужны URL из моего приложения.

Основная подсказка здесь - использовать функцию set_urlconfdjango.urls вместо перезаписи в классе или использования override_settings.

from django.test import TestCase
from django.urls import reverse, set_urlconf

class MyTests(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        set_urlconf('yourapp.urls')  # yourapp is the folder where you define your root urlconf.

    def test_url_resolving_with_app_urlconf(self):
        response = self.client.put(
            path=reverse('namespace:to:your:view-name'), data=test_data
        )
...