【问题标题】:Django testing, no 404 response when expectedDjango测试,预期时没有404响应
【发布时间】:2013-07-18 11:26:22
【问题描述】:

我正在 Django 中编写一些测试来检查我编写的应用程序。我或多或少正在研究这里的建议(http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/)。 然而,当我把像

    resp = self.client.get('made_up_url')
    self.assertEqual(resp.status_code, 404)

它不存在(因此我希望得到 404 响应,即测试将通过)...但测试失败说 200!=400,即似乎认为 made_up_url 是有效的页面。

有什么想法可能是错的吗?

【问题讨论】:

  • print resp 的节目是什么?
  • 你试过/made_up_url吗?
  • 这很奇怪。所以如果我去made_up_url,我会得到我写的404页面。如果我记录“resp”是什么,我会得到我的 404 页面的 html。我在我的设置页面中使用了 Debug (True/False),并且我有一个“TESTING”变量,它定义了我的 app/models.py 生成的模型,具体取决于我是否正在测试...... ..也许这是导致问题的原因
  • 也许我应该添加以下内容。在我的主要 app.models 中,我有: if TESTING: blah(models.Model) else: blah2(models.Model) 当我有 DEBUG = False 并且我的 TESTING 为 false 时,我的 404 页面很好...... TESTING=False 中定义的模型有一个完全填充的数据库....TESTING=True 中的模型有一个空数据库,我在测试过程中填充了一点......这是我有 TESTING=True 的时候,我就是无法收到 404 错误。

标签: django django-testing django-tests


【解决方案1】:

您正在尝试self.client.get 一个不存在的 URL:made_up_url。正如 dan-klasson 告诉你的,你需要得到/made_up_url。

我建议,不要在 self.client.get 参数中硬编码 URL,而是在 urls.py 文件中首先使用 name the related URL。所以你可以通过reverse函数解决。

然后,一旦你有一个name,你就可以在你的单元测试中这样做:

from django.core.urlresolvers import reverse

url = reverse('made_up_url')
resp = self.client.get(url)
self.assertEqual(resp.status_code, 404)

【讨论】:

  • 对不起,你的确切意思是什么?只是在我的 urlpatterns 中添加一个额外的 url?喜欢 url(r'^made_up_url/$', view, name='made_up_url')?我的观点会说什么......或者我可以使用已经存在的观点吗?
  • 我问是因为,如果我在 self.client.get 一个不存在的 url 时记录了 HTML 响应,我会得到我的 404 视图的 HTML...这很奇怪,因为某些部分的 Django 认为这是一个 404 错误,但我的测试认为这个 404 页面构成了一个 200 响应
  • 是的,我想我让你的方法在某种意义上“起作用”,同样的事情发生在以前......即如果我看到 resp 的样子,那是我的 404 页面 HTML,但 resp.status_code 仍然是 200 :(
  • 所以我刚刚删除了我的 handler404 并且一切正常......奇怪。为了让我自己的 404 正常运行,我应该更改设置中的某些内容吗?
  • 但是我的 404 页面仍然在浏览器中加载:S!!即使我已经删除了我的 handler404。离奇
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 2014-10-31
  • 2021-12-10
  • 2012-04-05
  • 1970-01-01
  • 2016-02-27
  • 2014-05-14
  • 2019-11-26
相关资源
最近更新 更多