2012-02-23 37 views
4

我正在嘗試爲我正在處理的Django應用程序編寫一些測試,但我還沒有決定要爲每個視圖使用的確切網址。因此,我在測試中使用了命名的URL。Django使用額外的GET參數測試命名的URL

例如,我有一個網址命名儀表盤:

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

這種觀點應該只提供給登錄的用戶。如果當前用戶是匿名的,則應將其重定向到登錄頁面,該頁面也是一個具名的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不想在測試中對其進行硬編碼。 @Dan:你可以在這裏基本遵循相同的方法,但用「%s」替換「dashboard」,併爲字符串參數傳遞'reverse('dashboard')'。 – 2012-02-23 12:08:38

+0

問題是GET參數無法直接寫入urls.py,因此@Dan可以在settings.py中使用LOGIN_REDIRECT_URL ='/ dashboard /'在登錄後重定向所需的url。如果您使用login_required裝飾器進行視圖功能,匿名將重定向到此網址。 – greg 2012-02-23 15:06:26

+1

你不需要在urls.py中做任何事情。 「next」參數的字面意思是「之後轉到以下URL」。他只需要聲明URL包含'?next =%s'%reverse('dashboard')'。然後,不管URL「儀表板」解決了什麼問題,它都會匹配。 – 2012-02-23 15:26:45

相關問題