2012-05-06 51 views
6

我正在嘗試使用Django 1.4的測試框架自動化404頁面測試。如何用django測試框架測試404 NOT FOUND?

如果我在運行開發服務器的瀏覽器地址欄中打印127.0.0.1:8000/something/really/weird/,我看到一個404頁面,並顯示正確的「404 NOT FOUND」狀態(如螢火蟲節目)。

但是,如果我嘗試使用此代碼來進行測試:

from django.test import TestCase 
class Sample404TestCase(TestCase): 
    def test_wrong_uri_returns_404(self): 
     response = self.client.get('something/really/weird/') 
     self.assertEqual(response.status_code, 404) 

測試失敗,此輸出:

$./manage.py test main 
Creating test database for alias 'default'... 
.F 
====================================================================== 
FAIL: test_wrong_uri_returns_404 (main.tests.Sample404TestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File ".../main/tests.py", line 12, in test_wrong_uri_returns_404 
    self.assertEqual(response.status_code, 404) 
*AssertionError: 200 != 404* 

---------------------------------------------------------------------- 
Ran 2 tests in 0.031s 

FAILED (failures=1) 
Destroying test database for alias 'default'... 

我在這裏獲得200碼嚴重意外。任何人都有任何想法,爲什麼在這種情況下發生?

更新:

這裏存在urls.py:http://pastebin.com/DikAVa8T 和實際失敗的測試是:

def test_wrong_uri_returns_404(self): 
    response = self.client.get('/something/really/weird/') 
    self.assertEqual(response.status_code, 404) 

一切都在發生項目https://github.com/gbezyuk/django-app-skeleton

+0

你的urls.py的外觀如何?下面的回答者對於領先的'/'是正確的,但即使如此,你也不應該爲無意義的URL獲得200。 – Nils

+0

我已更新問題描述。 確切的文件在這裏:https://github.com/gbezyuk/django-app-skeleton/blob/master/main/urls.py – gbezyuk

回答

2

的問題是,你的ViewFor404類返回200個狀態碼。看看Django的TemplateView定義:

class TemplateView(TemplateResponseMixin, View): 
    """ 
    A view that renders a template. 
    """ 
    def get_context_data(self, **kwargs): 
     return { 
      'params': kwargs 
     } 

    def get(self, request, *args, **kwargs): 
     context = self.get_context_data(**kwargs) 
     return self.render_to_response(context) 

所以你所有的類都是render_to_response,它會產生'200'響應。

如果你需要覆蓋404處理器,你應該做更多的東西像這樣的觀點:

return HttpResponseNotFound('<h1>Page not found</h1>') 

(我不知道在基於類的意見當量)

或者更好的是,你可以避免自定義視圖?要定製404顯示器,您可以創建一個404.html模板(在您網站的模板/目錄中),並且它將被Django的錯誤查看器拾取。

+0

謝謝您! 關於自定義視圖 - 我使用.haml而不是.html,所以我需要將404視圖映射到404.haml而不是404.html。 – gbezyuk

5

嘗試

response = self.client.get('/something/really/weird/') # note the '/' before something 

127.0.0.1:8000/something/really/weird//something/really/weird/相對於根路徑,

  • something/really/weird
  • something/really/weird/
  • /something/really/weird
+0

謝謝,但這並沒有改變,我仍然得到代碼200. – gbezyuk