gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:05:18 31 4
gpt4 key购买 nike

我刚开始学习单元测试并坚持解决这个问题。

我得到了这样的项目结构(现在是 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 not found”状态代码。

这两个网址在浏览器中都可以正常工作。

另外,我试过这个:
cd ./
python manage.py shell
>>> from django.test.client import Client
>>> c = Client()
>>> r = c.get('/myapp/example1/100100/')
>>> r.status_code
200

我只是不知道如何正确运行这些测试。似乎没有作为参数传递到 View 中的模式对我有用。但是 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 ,如果预期模型在测试数据库中不可用(如其中一条评论中所述),您可以获得 404。你也应该使用 Django 的 TestCase而不是 python 的 unittest因为前者从后者继承,但使与数据库的交互更容易(除其他外)。
设置测试数据的示例:

from django.test import TestCase
from django.urls import reverse

# Or whatever your object is.
from .models import Item


class ItemViewsTestCase(TestCase):
"""Tests for Item views."""
@classmethod
def setUpTestData(cls):
"""Set up test data available for all tests in this class."""
cls.item = Item.objects.create(name='Testing')

def test_item_list_view(self):
# Note, self.client we get for free from Django's TestCase.
response = self.client.get(reverse('itemlist'))
self.assertEqual(response.status_code, 200)

def test_item_detail_view(self):
# This url pattern expects an Item.id so use the item we set up.
url = reverse('item', args=[self.item.id])
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

关于python - django.test.client 在现有 url 上出现 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28173071/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com