来自Django测试的假404?

时间:2014-05-03 17:31:23

标签: python django unit-testing

我在测试我的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 个答案:

答案 0 :(得分:7)

您没有与item_id匹配的url(即数据库中没有“1”)。在您看来,它正在尝试获取Item,但它会引发异常,从而返回HTTP404。测试和视图完全正常工作。

单元测试会创建一个新的(空)数据库,因此您的常规数据库中的任何Items都不会出现。您需要在测试文件中使用您正在检查的Item创建item_id

样品:

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)