【问题标题】:Django testing named URLs with additional GET parametersDjango 使用附加 GET 参数测试命名 URL
【发布时间】:2012-02-23 10:45:32
【问题描述】:

我正在尝试为我正在开发的 Django 应用程序编写一些测试,但我还没有决定要为每个视图使用的确切 url。因此,我在测试中使用了命名的 url。

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

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

此视图应仅对登录用户可用。如果当前用户是匿名的,它应该将他们重定向到登录页面,这也是一个命名的 url。但是,当它这样做时,它会使用一个额外的 GET 参数来跟踪它刚刚来自的 url,结果如下:

/login?next=dashboard

当我尝试测试此重定向时,由于这些附加参数而失败:

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

显然,如果我将它们硬编码到测试中,它就会起作用:

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

但是,如果我决定更改仪表板视图的 URL,则必须更新使用它的每个测试。

我可以做些什么来更轻松地处理这些额外的参数吗?

任何建议表示赞赏。

谢谢。

【问题讨论】:

    标签: django testing reverse


    【解决方案1】:

    如您所见,reverse(...) 返回一个字符串。您可以将其用作:

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

    【讨论】:

    • 几乎有了,但您错过了 OP 问题的全部要点。他并不担心 URL 的“登录”部分,而是 nextGET 参数。 URL“仪表板”将来可能会更改,因此 OP 不想在测试中对其进行硬编码。 @Dan:您基本上可以在这里遵循相同的方法,但将“dashboard”替换为“%s”,并将reverse('dashboard') 传递给字符串参数。
    • 问题是GET参数不能直接写在urls.py中,所以@Dan你可以在settings.py中使用LOGIN_REDIRECT_URL = '/dashboard/' 来重定向登录后需要的url。如果你为视图函数使用 login_required 装饰器,匿名将被重定向到这个 url。
    • 你不需要在 urls.py 中做任何事情。 next 参数的字面意思是“之后转到以下 URL”。他只需要断言 URL 包含 '?next=%s' % reverse('dashboard')`。然后,无论“仪表板”解析为哪个 URL,它都会匹配。
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2012-01-18
    相关资源
    最近更新 更多