Django使用额外的GET参数测试命名URL

Dan*_*Dan 9 testing django reverse

我正在尝试为我正在处理的Django应用程序编写一些测试,但我还没有确定我想要为每个视图使用的确切网址.因此,我在测试中使用了命名网址.

例如,我有一个名为dashboard的网址:

c = Client()
resp = c.get(reverse('dashboard'))
Run Code Online (Sandbox Code Playgroud)

此视图仅适用于已登录的用户.如果当前用户是匿名用户,则应将其重定向到登录页面,该页面也是名为url的登录页面.但是,当它执行此操作时,它使用额外的GET参数来跟踪它刚刚来自的URL,这导致以下结果:

/login?next=dashboard
Run Code Online (Sandbox Code Playgroud)

当我尝试测试此重定向时,由于以下附加参数,它会失败:

# It's expecting '/login' but gets '/login?next=dashboard'
self.assertRedirects(resp, reverse('login'))
Run Code Online (Sandbox Code Playgroud)

显然,如果我将它们硬编码到测试中,它就可以工作:

self.assertRedirects(resp, '/login?next=dashboard')
Run Code Online (Sandbox Code Playgroud)

但是,如果我决定更改仪表板视图的URL,我将不得不更新使用它的每个测试.

有什么我可以做的,以便更容易处理这些额外的参数?

任何建议表示赞赏

谢谢.

gre*_*reg 5

如您所见,reverse(...)返回string,您可以使用:

self.assertRedirects(resp, '%s?next=dashboard' % reverse('login'))
Run Code Online (Sandbox Code Playgroud)

  • 差不多了,但是您错过了OP的整个问题。他并不担心URL的“登录”部分,而是担心“下一个” GET参数。URL“仪表盘”将来可能会更改,因此OP不想在测试中对其进行硬编码。@Dan:您基本上可以在此遵循相同的方法,但是将“ dashboard”替换为“%s”,并将`reverse('dashboard')`传递给字符串param。 (3认同)
  • 你不需要在urls.py中做任何事情.`next` param字面意思是"之后转到下面的URL".他只需断言URL包含'?next =%s'%reverse('dashboard')`.然后,无论"仪表板"解析到哪个URL,它都会匹配. (2认同)