2012-02-23 10 views
4

私が取り組んでいるDjangoアプリケーションのテストを書こうとしていますが、それぞれのビューに使用する正確なURLをまだ決めていません。したがって、私はテストで指定されたURLを使用しています。DjangoはGETパラメータを追加して名前付きURLをテストします

c = Client() 
resp = c.get(reverse('dashboard')) 

は、このビューでのみログインユーザーが利用できるようになります。

は例えば、私は、URLという名前のダッシュボードを持っています。現在のユーザーが匿名の場合は、名前付きのURLであるログインページにリダイレクトする必要があります。それがこれを行うときしかし、それは次のようになり、それはちょうどから来たURL、を追跡するために、追加のGETパラメータを使用していますのため

/login?next=dashboard 

私は、このリダイレクトをテストしようとすると、それが失敗しましたこれらの追加パラメータ:

明らか
# It's expecting '/login' but gets '/login?next=dashboard' 
self.assertRedirects(resp, reverse('login')) 

、私はハードのテストにそれらをコーディングする場合、それは動作します:

self.assertRedirects(resp, '/login?next=dashboard') 

しかし、その後、私が今まで私のダッシュボード・ビューのためのURLを変更する場合、私はそれを使用するすべてのテストを更新する必要があります。

これらの余分なパラメータを扱いやすくするためにできることはありますか?

アドバイスありがとうございます。

ありがとうございました。

答えて

4

あなたは(...)逆に、見ることができるように文字列を返す、あなたのように使用することができます。

self.assertRedirects(resp, '%s?next=dashboard' % reverse('login')) 
+1

ほとんどそれを持っていましたが、あなたはOPの質問の全体のポイントを逃しました。彼はURLの「ログイン」部分を気にするのではなく、「次の」GETパラメータを心配しています。 URLダッシュボードは将来変更される可能性がありますので、OPはテストでハードコーディングしたくありません。 @ダン:基本的にはここでも同じアプローチをとることができますが、 "ダッシュボード"を "%s"に置き換え、文字列paramに 'reverse( 'dashboard')'を渡します。 –

+0

問題は、GETパラメータをurls.pyに直接書き込むことができないため、ログイン後に必要なURLをsettings.pyで@Dan LOGIN_REDIRECT_URL = '/ dashboard /'を使用してリダイレクトできることです。そして、あなたがビュー機能にlogin_requiredデコレータを使用すると、anonymousはこのurlにリダイレクトされます。 – greg

+1

あなたはurls.pyで何もする必要はありません。 'next'パラメータは、文字通り「次のURLに行く」という意味です。彼はURLに '?next =%s'%reverse( 'dashboard') 'が含まれていると主張するだけです。それで、どんなURL「ダッシュボード」が解決しても、それは一致します。 –