为什么Django项目URL不能全部用于Django测试客户端?

时间:2010-08-20 16:07:04

标签: django django-urls django-testing

我一直在尝试将django-lean应用添加到我的项目中。 django-lean应用程序不在我正在进行的项目中,它位于PYTHONPATH。

我无法通过django-lean测试。

似乎问题是TestCase定义了url的值:

 urls = 'django_lean.experiments.tests.urls'

据我所知,测试只是将网址设为@'django_lean.experiments.tests.urls',但不是 来自项目其余部分的网址。

这会导致错误消息,如:

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

这些是由项目中的{%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/$

这对应于位于@'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模板标记调用,测试无法访问。

我正在使用Django 1.2.1运行Python 2.7

2 个答案:

答案 0 :(得分:2)

解决方案非常简单。只需将主项目中的URL导入到应用程序的urls.py中即可。

from forum.urls import urlpatterns

或更通用的解决方案:

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

答案 1 :(得分:1)

要列出您的django知道您可以使用answer suggested here的所有网址格式。 从测试中运行它并打印/记录输出。

请注意,最好明确说明从

中导入网址的位置
 from myproject import urls

因为你可能还有其他一些包含url文件的模块。