Python django.test.client在现有url上出现404错误

Python django.test.client在现有url上出现404错误,python,django,unit-testing,django-unittest,Python,Django,Unit Testing,Django Unittest,我刚开始学习单元测试,一直在解决这个问题 我得到了这样的项目结构(现在是Django 1.6.2): 在./myproject/url.py中,我有: from django.conf.urls import patterns, include, url urlpatterns = patterns('', url(r'^myapp/', include('myproject.myapp.urls')), ) from django.conf.urls import patterns,

我刚开始学习单元测试,一直在解决这个问题

我得到了这样的项目结构(现在是Django 1.6.2):

在./myproject/url.py中,我有:

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^myapp/', include('myproject.myapp.urls')),
)
from django.conf.urls import patterns, url

urlpatterns = patterns('myproject.myapp.views',
    url(r'^example1/$', 'itemlist'),  
    url(r'^example1/(?P<item_id>\w+)/$', 'item'),
)
在./myproject/myapp/url.py中,我有:

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^myapp/', include('myproject.myapp.urls')),
)
from django.conf.urls import patterns, url

urlpatterns = patterns('myproject.myapp.views',
    url(r'^example1/$', 'itemlist'),  
    url(r'^example1/(?P<item_id>\w+)/$', 'item'),
)
我从shell运行以下测试:

cd ./tests
python manage.py test
第一个测试运行正常,但第二个测试总是失败,状态代码为“404未找到”

两个URL在浏览器中都正常工作

此外,我尝试了以下方法:

cd ./
python manage.py shell
>>> from django.test.client import Client
>>> c = Client()
>>> r = c.get('/myapp/example1/100100/')
>>> r.status_code
200
我就是不知道如何正确地运行这些测试。似乎没有一种模式作为参数传递到视图中,对我来说是有效的。但是django.test.client可以正确地找到所有固定的URL

谢谢大家!

编辑:我刚刚发现我的myproject/myapp/views.py中有404个火灾

有一个代码:

def item(request, item_id):
    try:
        item = Item.objects.get(pk = int(item_id))
    except (ValueError, Item.DoesNotExist):     
        raise Http404
下面是Item.DoesNotExist异常。我不知道,为什么找不到那个东西

使用
reverse()
函数来构建URL,即:

/myproject/myapp/URL.py文件中,为每个URL模式指定一个名称参数,例如:

from django.conf.urls import patterns, url

urlpatterns = patterns('myproject.myapp.views',
    url(r'^example1/$', 'itemlist', name='example-one'),  
    url(r'^example1/(?P<item_id>\w+)/$', 'item', name='example-two'),
)

这应该可以解决问题。

除了使用
反向
,如果预期模型在测试数据库中不可用(如其中一条注释中所述),您还可以获得404。您还应该使用Django的
TestCase
而不是python的
unittest
,因为前者继承了后者,但使与数据库的交互更加容易(除其他外)

设置测试数据的示例如下:

来自django.test的
导入测试用例
从django.url反向导入
#或者不管你的目标是什么。
from.models导入项
类ItemViewsTestCase(测试用例):
“”“项目视图的测试。”“”
@类方法
def设置测试数据(cls):
“”“设置可用于此类中所有测试的测试数据。”“”
cls.item=item.objects.create(name='Testing')
def测试项目列表视图(自身):
#注意,我们从Django的测试用例中免费获得self.client。
response=self.client.get(反向('itemlist'))
self.assertEqual(response.status_代码,200)
def测试项目详细信息视图(自身):
#此url模式需要Item.id,因此请使用我们设置的项。
url=reverse('item',args=[self.item.id])
response=self.client.get(url)
self.assertEqual(response.status_代码,200)

您的数据库中是否有任何项目?如果不是,您可能应该插入一个或多个测试夹具。(您的测试数据库与生产数据库是分开的,所以不要担心吹走任何真实数据。)>测试数据库与生产数据库是分开的啊!知道了。所以unittest的目的和我想的略有不同。它不用于测试生产数据中的错误。傻我:)对。单元测试用于测试代码中的错误。这就是说,“代码中的错误”可以而且应该包括确保代码在不可用或损坏的数据面前表现出合理的行为,因此编写一个单元测试来专门测试是绝对有价值的,因为数据库中不存在具有指定ID的项,您的视图应该引发
Http404
(假设这是您在特定情况下的期望/预期行为)。
from django.core.urlresolvers import reverse

class PagesTestCase(unittest.TestCase): 
    ...
    def test_itemlist(self):
        url = reverse('example-one')
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

    def test_item(self):
        url = reverse('example-two')    
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)