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 の便利クラスを信用すると死ぬ。
以上です。よろしくお願いします。