我正在尝试使用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)
中发生了一切
答案 0 :(得分:5)
尝试
response = self.client.get('/something/really/weird/') # note the '/' before something
127.0.0.1:8000/something/really/weird/
相对于root的路径为/something/really/weird/
, 不
something/really/weird
something/really/weird/
/something/really/weird
答案 1 :(得分:2)
问题是您的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模板(在您网站的模板/目录中),它将被Django的错误查看器选中。