祢占堂

はい

Django で HttpResponse を返すようなビューの context をテストする

Django で render_to_response 使って返ってくるレスポンスからは template_name とか context とか取れない。

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template.context import RequestContext
 
 
def spam(request):
    response = render_to_response(
        template_name='spam.html',
        dictionary={'ham': 'HAM'},
        context_instance=RequestContext(request),
    )
    # response.template_name とかない
    # response.content にレンダリングしたあとの HTML が入ってる
    return response

TemplateResponse あたりを返せや、という話なんだけど Django の用意した便利クラス(FormPreview とか)がこういう返し方してたりするのでつらい。Django の便利クラスを信用すると死ぬ。

だけど実は template_name はテストできる方法があって、django.test.TestCase の assertTemplateUsed というのをコンテキストマネージャーとして使う。

def test_get(self):
    request = self._makeRequest('GET')
    with self.assertTemplateUsed('spam.html'):
        response = self._callFUT(request)

この中では django.test.signals.template_rendered というのを使っていて、テンプレートがレンダリングされたタイミングでフックさせて assert してるっぽい。

ただ、これの context バージョンがなかったので assertTemplateUsed の実装を真似して書いた。

以下、ギストで失礼します。

Django の便利クラスを信用すると死ぬ。

以上です。よろしくお願いします。