2012-02-23 66 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