2013-10-11 16 views
8

Vì vậy, tôi đang lập trình một trang web được chia thành các phần, chúng được chia thành các phần con. Trong thiết lập của tôi, khi người dùng nhấp vào liên kết đến một phần (ví dụ: '/ home'), họ được chuyển hướng đến một trong các phần phụ của nó (ví dụ: '/ home/cover'). Ngoài ra, khi người dùng truy cập vào trang gốc, họ được chuyển hướng đến một trong các phần (trong trường hợp của tôi là '/ home'). Với thiết lập đó, điều gì sẽ xảy ra khi ai đó đi vào thư mục gốc, là chúng được chuyển hướng đầu tiên đến '/ home' và từ đó đến '/ home/cover'. Những chuyển hướng được thực hiện như thế này:Django: Kiểm tra chuyển hướng khi URL mục tiêu cũng là một chuyển hướng

urls.py chính:

from django.conf.urls import patterns, include, url 
from django.views.generic.base import RedirectView 

urlpatterns = patterns('', 
    url(r'^$', RedirectView.as_view(url='/home')), 
    url(r'^home/', include('components.home.urls', namespace='components.home')), 
    ... 
) 

components/home/urls.py:

from django.conf.urls import patterns, include, url 
from django.views.generic.base import RedirectView 

from components.home import views 

urlpatterns = patterns('', 
    url(r'^$', RedirectView.as_view(url='cover')), 
    url(r'^cover$', views.cover, name='home_cover'), 
    ... 
) 

Trong thực tế, điều này dường như làm việc tốt: Tôi có thể điều hướng trang web của tôi và tất cả các chuyển hướng đều làm những gì họ nên làm. Tuy nhiên, tôi không thể tìm ra cách để thực hiện các bài kiểm tra đơn vị của mình cho chúng, và đặc biệt cho việc chuyển hướng gốc.

Các thử nghiệm tôi thiết kế ban đầu được như:

def test_root_url_redirects_to_home_url(self): 
    response = self.client.get('/') 
    self.assertRedirects(response, '/home', status_code=301) 

Tuy nhiên, khi tôi chạy nó, tôi đang phải đối mặt với các lỗi:

"AssertionError: 301 != 200 : Couldn't retrieve redirection page '/home': 
response code was 301 (expected 200)." 

Bây giờ, tôi có thể dễ dàng loại bỏ tất cả các chuyển hướng đôi và làm cho mọi URL được chuyển hướng trực tiếp đến đích của nó, nhưng cấu hình hiện tại cảm thấy sạch hơn và dễ bảo trì hơn, vì vậy nếu có cách nào đó tôi có thể kiểm tra nó đúng cách sẽ hoàn hảo.

Tôi rất mới với Django và phát triển web nói chung, vì vậy tôi xin lỗi nếu tôi thiếu câu trả lời rõ ràng ở đây.

Trả lời

15

TestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='')

Asserts that the response return a status_code redirect status, it redirected to expected_url (including any GET data), and the final page was received with target_status_code.

If your request used the follow argument, the expected_url and target_status_code will be the url and status code for the final point of the redirect chain.

Source: Django docs

Không có hại trong chuyển hướng kép (ngoài các yêu cầu HTTP bổ sung). Mang trong tâm trí, Django của khẳng định cũng kiểm tra các chuyển hướng đến URL nếu nó là một URL địa phương. Mã phản hồi mặc định mà nó mong đợi là 200, nhưng khi bạn có chuyển hướng kép, là 301, điều này không thành công. Vì vậy, để làm cho các trường hợp thử nghiệm thành công, là để khẳng định rằng chuyển hướng cũng chuyển hướng:

self.assertRedirects(response, '/home', status_code=301, target_status_code=301) 
+0

Thử nghiệm đã làm việc tốt với việc thêm 'target_status_code = 301'. Cảm ơn rất nhiều! – Ninethousand

+0

@Ninethousand không có vấn đề gì, nếu câu trả lời của tôi trả lời câu hỏi của bạn, vui lòng đánh dấu câu trả lời đó là câu trả lời đúng và cập nhật. Cảm ơn! – bouke

+0

Được đánh dấu đúng, nhưng tôi đã đăng ký gần đây nên tôi chưa được phép upvote. Tôi sẽ quay lại sau khi tôi có thể. – Ninethousand

0

Theo mặc định của Django assertRedirects fetches các mã trạng thái của trang và kiểm tra rằng nó OK. Bạn có thể tắt tính năng này bằng cách đặt fetch_redirect_response=False:

self.assertRedirects(response, reverse('app:login'), fetch_redirect_response=False) 
Các vấn đề liên quan