2011-02-03 1 views
23

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

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

ответ

4

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

У вас есть два варианта решения этого один должен предоставить файл собственный URL, как это было предложено ответить SystemParadox в:

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

Другой обезьяне залатать ваши URLs. Это НЕ рекомендуемый способ справиться с переопределением 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-адреса будут кэшироваться, а исправление вашей обезьяны не вступит в силу, если вы проведете тест вместе с другими тестовыми примерами.

+0

Но зачем вам это делать, используйте путь обезьяны в качестве последнего средства, когда вы не можете должным образом объявить что-то. Здесь вы явно устанавливаете 'my_app.urls' только для того, чтобы изменить пару строк позже! – ppetrid

+1

Это, конечно, не рекомендуемый способ, как правило, переопределять тестовые URL-адреса - 'my_app.urls' в этом случае является модулем URL-адресов приложений по умолчанию, а не тестовым, и это хакерский способ принудительного перезагрузки URL-адресов. Я просто добавил его, потому что столкнулся с ситуацией, когда исправление обезьян действительно требовало большого кода усилий, чем воссоздать весь модуль URL. – Geekfish

17

С Django 1.8 using of django.test.TestCase.urls is deprecated. Вы можете использовать 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 может применяться либо к целому классу или к определенному методу.

+3

Это полностью отменяет urlpatterns. Что, если я хочу добавить к ним, вместо этого? – Joost

+0

@Joost Вы можете сделать что-то вроде 'from myapp.urls import urlpatterns как base_patterns', а затем' urlpatterns = base_patterns + [<ваши пользовательские шаблоны здесь>] ' – pbaranay