Django 测试中的错误 404?

2 投票
1 回答
1776 浏览
提问于 2025-04-18 05:15

我在测试我的Django应用时遇到了一些麻烦。我在浏览器中可以正常加载页面,但我的测试代码却返回404错误。

这个测试返回了False:

def test_item(self):
    response = self.client.get('/items/1/')
    self.assertEqual(response.status_code, 200)

如果我在某个地方加一行打印代码...

print(response)

...它就会返回完整的HTML页面,正如我预期的那样:

Vary: Accept-Language, Cookie
Content-Type: text/html; charset=utf-8
Content-Language: en

<!DOCTYPE html>
... 
</html>

看起来不错(应该是200),但实际上并不是:

print(response.status_code)

...返回了404错误

我漏掉了什么呢?


版本信息

Django 1.6,Python 2.7.6

网址

http://localhost:8000/items/1/

urls.py

urlpatterns = patterns('',
    url(r"^(?P<item_id>[0-9]+/?)/$", "item.views.item_by_id",),
    )

views.py

def item_by_id(request, item_id):
    try:
        item = Item.objects.get(id=item_id)
    except Item.DoesNotExist:
        raise Http404
    return render(request, 'item.html', {'item': item})

1 个回答

7

你没有一个和你的 url 匹配的 item_id(也就是说,你的数据库里没有“1”这个记录)。在你的视图中,它试图获取 Item,但出现了错误,所以返回了一个 HTTP404。你的测试和视图的工作方式完全正确。

单元测试会创建一个新的(空的)数据库,所以你在正常数据库里有的任何 Items 都不会显示出来。你需要在测试文件中创建一个带有你正在检查的 item_idItem

示例:

def test_item(self):
    Item.objects.create(name="Item1") # Note you may need to edit the fields based on your model

    response = self.client.get('/items/1/')
    self.assertEqual(response.status_code, 200)

撰写回答