Почему не все URL-адреса проекта Django доступны тестовому клиенту Django?

Я пытался добавить приложение django-lean в свой проект. Приложение django-lean не находится в проекте, над которым я работаю, оно находится в PYTHONPATH.

Мне не удалось пройти тесты django-lean.

Кажется, проблема в том, что TestCase определяет значение для URL-адресов:

 urls = 'django_lean.experiments.tests.urls'

Насколько я могу судить, тесты получают только URL-адреса, расположенные @ 'django_lean.experiments.tests.urls', но не URL-адреса остальной части проекта.

Это вызывает сообщения об ошибках, такие как:

NoReverseMatch: Reverse for 'index' with arguments '()' and keyword arguments '{}' not found.

Они активируются тегами шаблона {% url %} в проекте.

Как я могу убедиться, что все URL-адреса проекта доступны для тестов?

РЕДАКТИРОВАТЬ: кто-то показал мне скрипт для печати видимых URL-адресов:

import urls

def show_urls(urllist, depth=0):
  for entry in urllist:
    print "  " * depth, entry.regex.pattern
    if hasattr(entry, 'url_patterns'):
        show_urls(entry.url_patterns, depth + 1)

Я вызвал этот скрипт из ipdb, вот результат:

   ipdb> import urls
   ipdb> show_urls(urls.urlpatterns)
    ^test-experiment/(?P<experiment_name>.*)$
    ^test-clientsideexperiment/(?P<experiment_name>.*)$
    ^admin/
      ^(?P<experiment_name>.+)/$
      ^$
    ^main-app/
      ^goal/(?P<goal_name>.*)$
      ^confirm_human/$

Это соответствует URL-адресам, расположенным @ 'django_lean.experiments.tests.urls'.

urlpatterns = patterns('django_lean.experiments.tests.views',
  url(r'^test-experiment/(?P<experiment_name>.*)$', 'experiment_test'),
  url(r'^test-clientsideexperiment/(?P<experiment_name>.*)$', 'clientsideexperiment_test'))

urlpatterns += patterns('',
   url(r'^admin/', include('django_lean.experiments.admin_urls')),
   url(r'^main-app/', include('django_lean.experiments.urls')),

Проблема, с которой я сталкиваюсь, заключается в том, что все мои тесты терпят неудачу из-за того, что именованные URL-адреса из других приложений в проекте вызываются тегами шаблона URL-адреса, недоступными для тестов.

Я использую Python 2.7 с Django 1.2.1.


person BryanWheelock    schedule 20.08.2010    source источник
comment
Что ж, если вы удалите явное ограничение URL-адресов, django по умолчанию использует URL-адреса проекта.   -  person lprsd    schedule 20.08.2010
comment
Я попытался закомментировать: # urls = 'django_lean.experiments.tests.urls' Я все еще получаю те же ошибки.   -  person BryanWheelock    schedule 20.08.2010


Ответы (2)


Решение было довольно простым. Просто импортируйте URL-адреса из основного проекта в файл urls.py для приложения.

from forum.urls import urlpatterns

или для более общего решения:

from settings import ROOT_URLCONF as project_urls
urlpatterns = __import__('forum.urls').urls.urlpatterns
person BryanWheelock    schedule 27.08.2010

Чтобы перечислить все шаблоны URL-адресов, которые знает ваш django, вы можете использовать ответ, предложенный здесь. Запустите это из своих тестов и распечатайте/зарегистрируйте вывод.

Просто обратите внимание, что лучше явно указать, откуда импортировать URL-адреса, например

 from myproject import urls

потому что у вас, вероятно, есть другие модули, содержащие файлы URL.

person Ofri Raviv    schedule 24.08.2010