我正在使用Harry J. W. Percival的Python测试驱动开发。我有一个Django视图,代码如下:
def view_list(request, list_id):
list_ = List.objects.get(id=list_id)
items = Item.objects.filter(list=list_)
return render(request, 'list.html', {'items':items})
以下Django测试:
def test_uses_list_template(self):
list_ = List.objects.create()
response = self.client.get('/lists/%d' % (list_.id,))
self.assertTemplateUsed(response, 'list.html')
urls.py包含以下条目:
url(r'^lists/(.+)/$', views.view_list, name='view_list'),
测试失败,出现以下错误:
self.fail(msg_prefix + "No templates used to render the response")
AssertionError: No templates used to render the response
这非常令人惊讶,因为当我使用浏览器手动评估视图时,视图呈现成功。并且自动功能测试无误地工作。
我查看了HTTP服务器,它显示了与此测试类似的情况的重定向: [时间]" GET / lists / 2 HTTP / 1.1" 301 0 [时间]" GET / lists / 2 / HTTP / 1.1" 200 476
答案 0 :(得分:3)
测试失败的原因是URL为/lists/%d
而不是/lists/%d/
(请注意第二个URL上的尾部斜杠。)因此self.client.get
导致了重定向(301)而不是成功(200)。最后使用斜杠更改测试。
response = self.client.get('/lists/%d/' % (list_.id,))
另请注意,在obeythetestinggoat.com Percival状态" Django有一些内置代码可以发出永久重定向(301),只要有人要求提供几乎正确的URL,除了缺少斜杠。 "