检查模板失败,因为“没有模板用于呈现响应”

M. *_*ter 5 python django tdd django-views python-3.x

我正在通过 Harry JW 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})
Run Code Online (Sandbox Code Playgroud)

以及以下 Django 测试:

def test_uses_list_template(self):
        list_ = List.objects.create()
        response = self.client.get('/lists/%d' % (list_.id,))
        self.assertTemplateUsed(response, 'list.html')
Run Code Online (Sandbox Code Playgroud)

urls.py 有以下条目:

url(r'^lists/(.+)/$', views.view_list, name='view_list'),
Run Code Online (Sandbox Code Playgroud)

测试失败并出现以下错误:

self.fail(msg_prefix + "No templates used to render the response")
AssertionError: No templates used to render the response
Run Code Online (Sandbox Code Playgroud)

这是非常令人惊讶的,因为当我使用浏览器手动评估它时,视图渲染成功。并且自动化功能测试没有错误。

我查看了 HTTP 服务器,它显示了与此测试类似的情况的重定向: [time] "GET /lists/2 HTTP/1.1" 301 0 [time] "GET /lists/2/ HTTP/1.1" 200 476

M. *_*ter 5

测试失败的原因有些随意,即 URL 不是/lists/%d/lists/%d/请注意第二个 URL 上的尾部斜杠)。因此,self.client.get导致重定向 (301) 而不是成功 (200)。使用末尾的斜杠更改测试。

response = self.client.get('/lists/%d/' % (list_.id,))
Run Code Online (Sandbox Code Playgroud)

另请注意,Percival 在obeythetestinggoat.com上指出“Django 有一些内置代码,每当有人请求几乎正确的 URL(除了缺少斜杠之外)时,都会发出永久重定向 (301)”。