如何使用django测试框架测试未找到的404?

如何使用django测试框架测试未找到的404?,django,testing,http-status-code-404,Django,Testing,Http Status Code 404,我正在尝试使用Django1.4的测试框架自动化404页测试 如果在运行development server的情况下在浏览器地址栏中打印127.0.0.1:8000/something/really/wird/,我会看到一个404页面,其状态为“404未找到”(如firebug所示) 但如果我尝试使用此代码进行测试: from django.test import TestCase class Sample404TestCase(TestCase): def test_wrong_uri

我正在尝试使用Django1.4的测试框架自动化404页测试

如果在运行development server的情况下在浏览器地址栏中打印
127.0.0.1:8000/something/really/wird/
,我会看到一个404页面,其状态为“404未找到”(如firebug所示)

但如果我尝试使用此代码进行测试:

from django.test import TestCase
class Sample404TestCase(TestCase):
    def test_wrong_uri_returns_404(self):
        response = self.client.get('something/really/weird/')
        self.assertEqual(response.status_code, 404)
此输出导致测试失败:

$./manage.py test main
Creating test database for alias 'default'...
.F
======================================================================
FAIL: test_wrong_uri_returns_404 (main.tests.Sample404TestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../main/tests.py", line 12, in test_wrong_uri_returns_404
    self.assertEqual(response.status_code, 404)
*AssertionError: 200 != 404*

----------------------------------------------------------------------
Ran 2 tests in 0.031s

FAILED (failures=1)
Destroying test database for alias 'default'...
我对这里有200个代码感到非常惊讶。有人知道这到底是为什么吗

更新: 下面是URL.py: 实际失败的测试是:

def test_wrong_uri_returns_404(self):
    response = self.client.get('/something/really/weird/')
    self.assertEqual(response.status_code, 404)
项目中的一切都在发生

试试看

response = self.client.get('/something/really/weird/') # note the '/' before something
127.0.0.1:8000/something/really/wird/
是相对于根的路径中的
/something/really/wird/
,而不是

  • something/真的/奇怪
  • something/really/wird/
  • /something/真的/奇怪

问题是ViewFor404类返回200状态码。看看Django的TemplateView定义:

class TemplateView(TemplateResponseMixin, View):
    """
    A view that renders a template.
    """
    def get_context_data(self, **kwargs):
        return {
            'params': kwargs
        }

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)
因此,您的类所做的只是一个render_to_响应,它生成一个“200”响应

如果需要重写404处理程序,则应在视图中执行类似操作:

return HttpResponseNotFound('<h1>Page not found</h1>')
返回HttpResponseNotFound('未找到页面')
(我不知道基于类的视图中的等效项)


或者更好的是,可以避免自定义视图吗?要自定义404显示,您只需创建一个404.html模板(在站点的模板/目录中),Django的错误查看器就会获取该模板。

您的URL.py是什么样子的?下面的回答者关于前导“/”是正确的,但即使这样,你也不应该因为一个荒谬的url而得到200分。我已经更新了问题描述。确切的文件在这里:谢谢,但这并没有改变什么,我仍然得到代码200。谢谢!关于自定义视图-我使用.haml而不是.html,因此我需要将404视图映射到404.haml而不是404.html。