10

我正在尝试使用 Django 1.4 的测试框架自动化 404 页面测试。

如果我在运行开发服务器的浏览器地址栏中打印127.0.0.1:8000/something/really/weird/,我会看到一个 404 页面,并显示正确的“404 NOT FOUND”状态(如萤火虫所示)。

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

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 个代码感到非常惊讶。任何人都知道为什么会发生这种情况?

更新:

这里是 urls.py:http://pastebin.com/DikaVa8T 实际失败的测试是:

def test_wrong_uri_returns_404(self):
    response = self.client.get('/something/really/weird/')
    self.assertEqual(response.status_code, 404)

项目中的一切都在发生https://github.com/gbezyuk/django-app-skeleton

4

2 回答 2

6

尝试

response = self.client.get('/something/really/weird/') # note the '/' before something

127.0.0.1:8000/something/really/weird/在相/something/really/weird/对于根的路径中,而不是

  • something/really/weird
  • something/really/weird/
  • /something/really/weird
于 2012-05-06T07:56:46.303 回答
4

问题是您的 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_response,它会生成一个'200'响应。

如果您需要覆盖 404 处理程序,您应该在视图中执行更多类似的操作:

return HttpResponseNotFound('<h1>Page not found</h1>')

(我不知道基于类的视图中的等价物)

或者更好的是,你能避免自定义视图吗?要自定义 404 显示,您只需创建一个 404.html 模板(在您网站的 templates/ 目录中),它将被 Django 的错误查看器拾取。

于 2012-05-21T07:59:46.573 回答