2013-10-11 13 views
8

私はセクションで分けられたサイトをプログラミングしています。それ自体はサブセクションで分かれています。私の設定では、ユーザーがセクションへのリンクをクリックすると(例えば '/ home'としましょう)、それらのサブセクションの1つにリダイレクトされます(例えば、 '/ home/cover')。さらに、ユーザーがページルートに移動すると、セクションの1つ(私の場合は '/ home')にリダイレクトされます。その設定では、誰かがルートに行くときに何が起こるのか、最初に '/ home'にリダイレクトされ、そこから '/ home/cover'にリダイレクトされます。Django:ターゲットURLもリダイレクトである場合のリダイレクトのテスト

メインurls.py:

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')), 
    ... 
) 

コンポーネント/ホーム/ 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'), 
    ... 
) 

、これは正常に動作するようです:私は移動することができます私のサイトとすべてのリダイレクトは、彼らがすべきことをします。しかし、私はユニットテストを実装する方法、特にルートリダイレクトを理解することはできません。私はそれを実行したとき、私はエラーに直面していますが、

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

:今

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

、私は簡単にすべての二重のリダイレクトを削除することができ

私はもともと設計されたテストは、のようでしたすべてのリダイレクトされたURLポイントをターゲットに直接渡しますが、現在の設定ではよりクリーンでメンテナンスが容易なので、何らかの方法で正しくテストすることができれば完璧です。

私はDjangoとWeb開発の一般的な話から新しくなっています。ここではっきりと答えがわからないのは残念です。

答えて

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

(余分なHTTPリクエストを除いて)二重リダイレクトには問題ありません。 Djangoの主張は、ローカルURLの場合はリダイレクトされたURLもテストします。予想されるデフォルトの応答コードは200ですが、二重リダイレクトが301であるため、これは失敗します。

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

このテストは、 'target_status_code = 301'を追加して正常に動作しました。どうもありがとう! – Ninethousand

+0

@Ninethousand問題はありませんが、私の回答があなたの質問に答えた場合は、それを正しい答えとupvoteとしてマークしてください。ありがとう! – bouke

+0

正解とマークされましたが、私は最近登録したので、まだupvoteすることはできません。私はできるだけ後で戻ってきます。 – Ninethousand

0

をデフォルトでDjangoのassertRedirectsが、それはOKだページやテストのステータスコードをフェッチ:だからテストケースを成功させるためには、リダイレクトもリダイレクトすることを主張することです。 fetch_redirect_response=Falseを無効にすることができます。

self.assertRedirects(response, reverse('app:login'), fetch_redirect_response=False) 
関連する問題