2012-05-06 38 views
6

Tôi đang cố gắng tự động kiểm tra trang 404 bằng cách sử dụng khung thử nghiệm của Django 1.4.Làm thế nào để kiểm tra 404 NOT FOUND với khung kiểm tra django?

Nếu tôi in 127.0.0.1:8000/something/really/weird/ trong thanh địa chỉ trình duyệt với máy chủ phát triển đang chạy, tôi thấy trang 404, với trạng thái "404 NOT FOUND" chính xác (dưới dạng chương trình firebug).

Nhưng nếu tôi cố gắng sử dụng mã này để thử nghiệm:

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) 

thử nghiệm thất bại với sản lượng này:

$./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'... 

Tôi nghiêm túc ngạc nhiên với nhận 200 mã ở đây. Bất cứ ai có bất kỳ ý tưởng tại sao trên trái đất này đang xảy ra?

Cập nhật:

đây nằm urls.py: http://pastebin.com/DikAVa8T và thực tế thử nghiệm thất bại là:

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

tất cả mọi thứ đang diễn ra trong dự án https://github.com/gbezyuk/django-app-skeleton

+0

url của bạn trông như thế nào? Người trả lời dưới đây là chính xác về '/' hàng đầu, nhưng thậm chí sau đó bạn không nên nhận được 200 cho một url vô nghĩa. – Nils

+0

Tôi đã cập nhật mô tả câu hỏi. Tệp chính xác nằm ở đây: https://github.com/gbezyuk/django-app-sk/blob/master/main/urls.py – gbezyuk

Trả lời

2

Vấn đề là lớp ViewFor404 của bạn trả về một mã trạng thái 200. Xem định nghĩa của Templateango Django:

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) 

vì vậy tất cả các lớp của bạn là render_to_response, tạo ra phản hồi '200'.

Nếu bạn cần phải ghi đè xử lý 404, bạn nên làm một cái gì đó như thế này trong giao diện:

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

(Tôi không biết tương đương trong quan điểm dựa trên lớp)

Hoặc tốt hơn, bạn có thể tránh tùy chỉnh Chế độ xem không? Để tùy chỉnh hiển thị 404, bạn chỉ có thể tạo mẫu 404.html (trong mẫu/thư mục của trang web của bạn) và nó sẽ được trình xem lỗi của Django chọn.

+0

Cảm ơn bạn! Và về việc tùy chỉnh chế độ xem - tôi sử dụng .haml thay vì .html, vì vậy tôi cần ánh xạ chế độ xem 404 lên 404.haml thay vì 404.html bằng cách nào đó. – gbezyuk

5

Hãy thử

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

127.0.0.1:8000/something/really/weird//something/really/weird/ trong đường dẫn tương đối so với thư mục gốc, không

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

Cảm ơn bạn, nhưng điều đó đã không thay đổi gì và tôi vẫn nhận được mã 200. – gbezyuk

Các vấn đề liên quan