开发者

Why are the Django project URLs not all available to the Django test client?

I've been开发者_高级运维 trying to add the django-lean app to my project. The django-lean app is not located in the project I'm working on, it is on the PYTHONPATH.

I have not been able to get the django-lean tests to pass.

It seems the issue is that the TestCase defines a value for urls:

 urls = 'django_lean.experiments.tests.urls'

As best as I can tell, the tests are only getting the urls located @ 'django_lean.experiments.tests.urls', but not the urls from the rest of the project.

This is causing error messages like:

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

These are triggered by {% url %} template tags in the project.

How can I make sure that the all the urls of the project are available for the tests?

EDIT: Someone showed me a script to print the visible URLs:

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)

I called this script from ipdb, this was the output:

   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/$

This corresponds to the urls located @ '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')),

The issue that I'm having is that my tests all fail because of the named urls from other apps in the project are called by URL template tags are not accessible to the tests.

I'm running Python 2.7 with Django 1.2.1


The solution was pretty simple. Just import the URLs from the main project into the urls.py for the app.

from forum.urls import urlpatterns

or for a more generic solution:

from settings import ROOT_URLCONF as project_urls
urlpatterns = __import__('forum.urls').urls.urlpatterns


To list all the url patterns your django knows you can use the answer suggested here. Run this from your tests and print/log the output.

Just note that its better to explicitly state where to import the urls from like

 from myproject import urls

because you probably have some other modules containing urls files.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜