【问题标题】:Django test case with invalid URL but giving 200带有无效 URL 但给出 200 的 Django 测试用例
【发布时间】:2021-09-02 15:09:25
【问题描述】:

当运行开发服务器(py manage.py runserver)和用户浏览器的url“localhost:8000//index.html”时,它给出404。

但在运行测试时,client.get('//index.html') 为200,内容与对('/') 的请求相同。

运行开发服务器时,使用py manage.py shell,然后从django.test import Client,直接运行也是一样的结果。

这是 Client.get() 函数的问题吗?还是我用错了?


    def test_invalid_url2(self):
        response=self.client.get('//index.html')
        self.assertEqual(response.status_code, 404)

【问题讨论】:

标签: python django


【解决方案1】:

带有多个斜杠的 URL 是完全有效的。 (有关所有血腥技术细节,请参阅RFC 2396。)但是,并非所有软件都平等对待它们。您在这里看到了浏览器行为和 Django 测试客户端之间的差异。

归根结底,您需要问自己,您在这里真正测试的是什么?你真的关心如何处理双斜线吗?这似乎是一个最好留给 django 自行解析的细节,让 django 开发人员来测试该行为。

您的测试应该只测试您自己的应用的行为。对于我自己的应用程序,我测试路由在可访问时返回 200。或者,如果我使用 Django 的权限明确拒绝访问,那么我将编写一个测试,根据需要返回 403 或 404。

另外,我从不在测试中使用显式路径。相反,我使用reverse() 来查找给定名称的路径。

【讨论】:

  • 谢谢。我有 '' 和 '/',应该登陆到默认主页。然后我尝试测试是否添加任何内容应该是 404,但错误地输入了“//index.html”而不是“/index.html”。后一个是 '/index.html' 按预期返回 404。但是我在开始时输入错误的前一个是默认主页给出 200。因为它让我感到困惑,所以在这里提出一个问题。如果这不合适,对不起。谢谢。
  • @BonLee 对于返回 200 的测试,response.url 是什么?
  • 使用 get 从 Client 对象返回的响应,没有 .url 属性。但它已从服务器返回内容。内容是与 urls.py 中定义的 '' 匹配的内容,应该类似于“localhost:8000
猜你喜欢
  • 1970-01-01
  • 2014-08-14
  • 2020-09-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2013-06-10
相关资源
最近更新 更多