web-dev-qa-db-ja.com

テストFlask render_template()コンテキスト

初心者Flask質問。

次のようなFlaskルートがあります。

_@app.route('/')                                                                 
def home():                                                                                                                  
    return render_template(                                                     
        'home.html',                                                            
        greeting:"hello"                                       
    )                                                                           
_

_'home.html'_テンプレートがレンダリングされたこと、およびrender_template()コンテキストがgreeting変数を特定の値で定義したことをテストするにはどうすればよいですか?

これらは簡単にテストできるはずです(おそらく簡単です)が、Flaskとunittestを使用してこれを行う方法は本当にわかりません。

29
Shailen Tuli

assert_template_usedTestCaseのメソッド flask-testing によって提供されます。

from flask.ext.testing import TestCase

class MyTest(TestCase):

    def create_app(self):
        return myflaskapp

    def test_greeting(self):
        self.app.get('/')
        self.assert_template_used('hello.html')
        self.assert_context("greeting", "hello")

メソッドcreate_appはflaskアプリを提供する必要があります。

14
Jarus

私の提案は、 テスト用のFlaskドキュメント を参照することです。

ドキュメントをガイドとして使用すると、応答の内容を確認できるテストケースを設定できるはずです。

import unittest
import yourappname

class MyAppTestCase(unittest.TestCase):
    def setUp(self):
        self.app = yourappname.app.test_client()

    def test_greeting(self):
        rv = self.app.get('/')
        self.assertIn('hello', rv.data)

ここで、yourappnameはアプリ/プロジェクトの名前です。

4
stephenmuss

Flask公式ドキュメントtemplate_renderedシグナル(バージョン0.6以降で使用可能)テンプレートおよびそのレンダリングに使用される変数の単体テスト用。

たとえば、次のヘルパーコンテキストマネージャーは、ユニットテストで使用して、レンダリングされたテンプレートとテンプレートに渡された変数を判別できます。

from flask import template_rendered
from contextlib import contextmanager

@contextmanager
def captured_templates(app):
    recorded = []
    def record(sender, template, context, **extra):
        recorded.append((template, context))
    template_rendered.connect(record, app)
    try:
        yield recorded
    finally:
        template_rendered.disconnect(record, app)

これは簡単にテストクライアントとペアにすることができます。

with captured_templates(app) as templates:
    rv = app.test_client().get('/')
    assert rv.status_code == 200
    assert len(templates) == 1
    template, context = templates[0]
    assert template.name == 'index.html'
    assert len(context['items']) == 10
4
tilacog

HtmlページでJinjaセットアップを使用し、変数をページに渡して、更新されているかどうかを確認することができます。

http://flask.pocoo.org/docs/0.11/templating/#jinja-setup

http://jinja.pocoo.org/

例として:

フラスコテンプレート

@app.route('/')                                                                 
def home():                                                                                                                  
    return render_template(                                                     
        'home.html',                                                            
        greetingDictionary = {"greeting": "hello" , "forthoseabouttorock" :"wesaluteyou" }                                       
    )   

hTMLページ

{% for key in greetingDictionary %}
<h1>{{key}}</h1>
<p>{{greetingDictionary[key]}}</p>
{% endfor %}
1
user305883