【问题标题】:URL quoted forward slash in self.assertRedirects(response, expected_url, status_code=302, target_status_code=200)URL 在 self.assertRedirects 中引用正斜杠(response,expected_url,status_code=302,target_status_code=200)
【发布时间】:2015-07-12 07:56:28
【问题描述】:

我有以下测试用例

def testNoAccessWithoutLogin(self):
    """
    Tests that redirected to the login page if you are not logged in
    """
    response = self.client.get(reverse('expenseList'), follow=True)
    expected_url = reverse('login') + "?next=" + reverse('expenseList')
    self.assertRedirects(response, expected_url, status_code=302, 
        target_status_code=200)
    expected_url = reverse('login') + "?next=" + reverse('purchaseList')
    response = self.client.get(reverse('purchaseList'), follow=True)
    self.assertRedirects(response, expected_url, status_code=302, 
        target_status_code=200)
# end testNoAccessWithoutLogin

我失败了

================================================ ===================== 失败:testNoAccessWithoutLogin (procurement.tests.expenseTests) -------------------------------------------------- -------------------- Traceback(最近一次调用最后一次):文件 “/Users/jason/public_html/activity/project/procurement/tests.py”,行 66、在testNoAccessWithoutLogin target_status_code=200)文件“/Users/jason/.virtualenvs/activity/lib/python2.7/site-packages/django/test/testcases.py”, 第 304 行,在 assertRedirects 中 (url, expected_url)) AssertionError: 响应重定向到'http://testserver/login/?next=%2Fprocurement%2FexpenseList%2F', 预期'http://testserver/login/?next=/procurement/expenseList/'

我认为这是因为“%2F”不等于“/”,但为什么响应的 url 被引用了?

被测试的函数用

装饰
@login_required

【问题讨论】:

  • 你还没有说expenseList 是如何进行重定向的。你在使用login_required 装饰器吗?它需要对查询字符串参数进行urlencode,以防它们包含#&等字符,但是,正斜杠should not be quoted
  • 是的,expenseList 用@login_required 修饰。我尝试在 expected_url 上使用 urllib.quote 和 unquote 以使其匹配,但这不起作用。

标签: django url testcase quote


【解决方案1】:

next 查询参数值是 URL 编码的;所以你必须做同样的事情来验证重定向。

response = self.client.get(reverse('expenseList'), follow=True)
expected_url = reverse('login') + "?next=" + urllib.quote(reverse('expenseList'), "")
self.assertRedirects(response, expected_url, status_code=302, 
    target_status_code=200)

注意urllib.quote 的第二个参数是"",因为

urllib.quote(string[, safe])

使用 %xx 转义符替换字符串中的特殊字符。从不引用字母、数字和字符“_.-”。默认情况下,此函数用于引用 URL 的路径部分。可选的安全参数指定不应被引用的其他字符 - 其默认值为 '/'

来源docs on python.org

【讨论】:

  • 谢谢。我应该想到的。我尝试在整个 URL 上引用、取消引用等,而不仅仅是查询参数。
猜你喜欢
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多