【问题标题】:Urls with name are not accessible in Django Client Tests (NoReverseMatch error)在 Django 客户端测试中无法访问具有名称的 URL(NoReverseMatch 错误)
【发布时间】:2016-04-05 09:58:23
【问题描述】:

我正在 django 应用程序中为我的视图编写测试。以前它们位于我的视图所在的同一目录中。他们工作得很好。但后来我在 django 应用程序中将它们移动到文件夹名称 tests 中。没有导入错误,但我收到 NoReverseMatch 错误。我的目录结构如下。

Project
    settings.py
    urls.py
    |my_app
        |tests
            |tests.py
            |__init__.py
        |migrations
           |__init__.py
        |views.py
        |models.py
        |urls.py

我的代码如下

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django
django.setup()
from rest_framework.reverse import reverse
from rest_framework import status
from rest_framework.test import APITestCase

class MyTests(APITestCase):

    def test_01(self):
        url = reverse('login')
        data = {'username': 'username', 'password': 'StrongPassword'}
        response = self.client.post(url, data)
        self.assertEqual(response.data, my_expected_output)

我得到的错误是

NoReverseMatch: Reverse for 'login' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

谁能告诉我哪里做错了 我的 my_app/urls.py 文件是这样的

from rest_framework import routers
from my_app import views as app_views
from django.conf.urls import url, patterns, include

router = routers.DefaultRouter()

urlpatterns = [
           url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
           url(r'^login/$', app_views.login_view, name='login'),
           url(r'^docs/', include('rest_framework_swagger.urls')),

           url(r'^provider/$',
               app_views.EntityViewSet.as_view({'get': 'list'}), name="provider-list"),
           url(r'^provider/(?P<pk>\d+)/$',
               app_views.EntityViewSet.as_view({'get': 'retrieve'}), name="provider-detail"),
           ]

urlpatterns += router.urls

我的主要 urls.py 是这样的。该文件与我的 settings.py 文件处于同一级别。我已经更新了我的目录结构。

   urlpatterns = patterns(
       '',
       url(r'^app/', include('app.urls')),
   )

【问题讨论】:

  • 你能显示你的主要 urls.py 和 my_app.urls.py 吗?
  • 我已经添加了我的主 urls.py 文件。我无法粘贴整个文件,因为它太大了。但我在主 urls.py 中包含了我的应用程序的 url。
  • app/urls.py 中是否有名为login 的url,它是什么样子的?
  • 就像 url(r'^login/', app.login_view, name='login'),
  • 哦...但是我在许多其他 url 上都遇到了同样的错误,而且我的结尾是 '$'。

标签: django unit-testing django-rest-framework


【解决方案1】:

我能够通过像这样将 url 放入我的测试用例中来解决我的错误

class MyTests(APITestCase):

    urls = 'my_app.urls'        

    def test_01(self):
        url = reverse('login')
        data = {'username': 'username', 'password': 'StrongPassword'}
        response = self.client.post(url, data)
        self.assertEqual(response.data, my_expected_output)

【讨论】:

  • 我想知道它是如何工作的,我遇到了同样的问题,并且能够通过您的方法解决它
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 2017-03-14
  • 2016-06-10
相关资源
最近更新 更多