2009-11-06 11 views
28

Djangoアプリケーションに一連のテンプレートタグを追加していますが、私はそれらをテストする方法がわかりません。私はそれらを私のテンプレートで使ってきましたが、彼らは働いているようですが、もっとフォーマルなものを探していました。メインロジックはモデル/モデルマネージャで実行され、テストされています。タグは、単にデータを取得し、そのようなDjangoでカスタムテンプレートタグをテストするには?

{% views_for_object widget as views %} 
""" 
Retrieves the number of views and stores them in a context variable. 
""" 
# or 
{% most_viewed_for_model main.model_name as viewed_models %} 
""" 
Retrieves the ViewTrackers for the most viewed instances of the given model. 
""" 

として、コンテキスト変数に格納だから私の質問は、あなたが通常あなたのテンプレートタグをテストしないと、あなたはあなたがそれをどのように行うのかない場合はありますか?

答えて

30

これはTestCaseクラスでself.render_template簡単なヘルパーメソッドがある私のテストファイルのいずれかの短い通過、次のとおりです。

rendered = self.render_template(
     '{% load templatequery %}' 
     '{% displayquery django_templatequery.KeyValue all() with "list.html" %}' 
    ) 
    self.assertEqual(rendered,"foo=0\nbar=50\nspam=100\negg=200\n") 

    self.assertRaises(
     template.TemplateSyntaxError, 
     self.render_template, 
     '{% load templatequery %}' 
     '{% displayquery django_templatequery.KeyValue all() notwith "list.html" %}' 
    ) 

これは非常に基本的なもので、ブラックボックステストを使用しています。それはちょうどテンプレートソースとして文字列を取り、レンダリングし、出力が期待される文字列と等しいかどうかをチェックします。

render_template方法は非常に単純です:

from django.template import Context, Template 

class MyTest(TestCase): 
    def render_template(self, string, context=None): 
     context = context or {} 
     context = Context(context) 
     return Template(string).render(context) 
+0

再利用可能なアプリケーションについて、これをプロジェクト範囲外でどのようにテストしますか? '{%load custom_tag%} 'を含むテンプレート文字列をレンダリングしても、少なくとも追加作業は必要ありません。 – Santa

+2

私自身の質問に答えました:use 'register = template.Library(); template.libraries ['django.templatetags.mytest'] =登録; register.tag(name = 'custom_tag'、compile_function = custom_tag) '。 – Santa

+2

コードサンプルに 'self'とは何ですか? 'My TestCase'オブジェクトに' render_template'メソッドがありません –

0

文字列はテンプレートとしてレンダリングすることができるので、templatetagを文字列として使用して単純な「テンプレート」を含むテストを作成し、特定のコンテキストが正しくレンダリングされるようにすることができます。

+0

タグのみ空の文字列をレンダリングし、代わりにコンテキストを変更するが、私はテストすることができるはずテンプレートタグをテストする方法の良い例そのためにも。 –

0

私はテンプレートタグをテストしていたときに、自分自身でタグを持つことになりました。私が使っていたテキストやdictを含む文字列を返します。他の提案の行に沿って並べ替えます。

タグでは、コンテキストを変更したり、レンダリングする文字列を返すことができるため、レンダリングされた文字列を表示するのが最も速いことがわかりました。代わりの

return '' 

はそれを持っている:

return str(my_data_that_I_am_testing) 

あなたが幸せになるまで。

17

あなたは正しい軌道に乗っています。これは、レンダリング後のコンテキストが正しく変更されたことを確認することができます:

class TemplateTagsTestCase(unittest.TestCase):   
    def setUp(self):  
     self.obj = TestObject.objects.create(title='Obj a') 

    def testViewsForOjbect(self): 
     ViewTracker.add_view_for(self.obj) 
     t = Template('{% load my_tags %}{% views_for_object obj as views %}') 
     c = Context({"obj": self.obj}) 
     t.render(c) 
     self.assertEqual(c['views'], 1) 
関連する問題