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我的儀表板視圖,我不得不更新每個使用它的測試。
有什麼我可以做的,使它更容易處理這些額外的參數?
任何意見讚賞。
謝謝。
幾乎擁有了,但是你錯過了OP的問題的全部要點。他並不擔心URL的「登錄」部分,而是「下一個」GET參數。 URL「儀表板」將來可能會更改,因此OP不想在測試中對其進行硬編碼。 @Dan:你可以在這裏基本遵循相同的方法,但用「%s」替換「dashboard」,併爲字符串參數傳遞'reverse('dashboard')'。 – 2012-02-23 12:08:38
問題是GET參數無法直接寫入urls.py,因此@Dan可以在settings.py中使用LOGIN_REDIRECT_URL ='/ dashboard /'在登錄後重定向所需的url。如果您使用login_required裝飾器進行視圖功能,匿名將重定向到此網址。 – greg 2012-02-23 15:06:26
你不需要在urls.py中做任何事情。 「next」參數的字面意思是「之後轉到以下URL」。他只需要聲明URL包含'?next =%s'%reverse('dashboard')'。然後,不管URL「儀表板」解決了什麼問題,它都會匹配。 – 2012-02-23 15:26:45