我刚开始学习单元测试,遇到了这个问题。
我的项目结构如下(现在是Django 1.6.2):
./manage.py
./myproject
./myproject/urls.py
./myproject/myapp/
./myproject/myapp/urls.py
./myproject/myapp/views.py
./tests/
./test/test_example.py
在./myproject/urls.py文件中,我有以下内容:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^myapp/', include('myproject.myapp.urls')),
)
在./myproject/myapp/urls.py中,我有以下内容:
from django.conf.urls import patterns, url
urlpatterns = patterns('myproject.myapp.views',
url(r'^example1/$', 'itemlist'),
url(r'^example1/(?P<item_id>\w+)/$', 'item'),
)
我编写了基础测试,并将其放入./test/test_example.py中。
import unittest
from django.test import Client
class PagesTestCase(unittest.TestCase):
def setUp(self):
self.client = Client()
def test_itemlist(self):
response = self.client.get('/myapp/example1/')
self.assertEqual(response.status_code, 200)
def test_item(self):
response = self.client.get('/myapp/example1/100100/')
self.assertEqual(response.status_code, 200)
我通过以下方式在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
我就是无法弄清楚如何正确运行那些测试。似乎没有任何一个作为参数传递给视图的模式对我有效。但是所有固定的URL都能被Django.test.client正确找到。
谢谢!
编辑:我刚发现404在我的myproject/myapp/views.py中触发了
这是一段代码:
def item(request, item_id):
try:
item = Item.objects.get(pk = int(item_id))
except (ValueError, Item.DoesNotExist):
raise Http404
这里出现了Item.DoesNotExist异常。我不知道为什么找不到那个项目?