2014-05-03 88 views
2

我在測試我的Django應用程序時遇到了問題。我可以在瀏覽器中加載一個頁面就好了,但我的測試代碼返回404Django測試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> 

這看起來不錯(應該是20 0)給我。但它不是:

print(response.status_code) 

...返回404

我缺少什麼?


版本

Django的1.6,Python的2.7.6

URL

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}) 
+0

的是,在你的第一個代碼塊中的錯誤?它顯示你正在測試'resp_1'的'status_code',但它應該測試'response'。 – Alex

+0

是的,對不起;來自複製/粘貼的神器。我更新了我的問題。謝謝! – allanberry

+0

你可以添加查看代碼嗎? – Alex

回答

7

你沒有匹配的item_idurl(即,有一個在你的數據庫中沒有 「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) 
+0

是的,仍然圍繞着一些核心的Django概念。非常感謝。 – allanberry

+1

沒有問題,堅持下去。 – Alex