测试Flask render_template()上下文

时间:2014-06-02 04:56:59

标签: python flask

新手烧瓶问题。

我有一个Flask路线,如下所示:

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

如何测试'home.html'模板是否已呈现,render_template()上下文是否定义了具有特定值的greeting变量?

这些应该(并且可能)很容易测试,但我真的不确定如何使用Flask和unittest来做到这一点。

4 个答案:

答案 0 :(得分:14)

您可以使用flask-testing提供的assert_template_used TestCase方法。

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必须提供你的烧瓶应用程序。

答案 1 :(得分:4)

我的建议是看一下Flask documentation for testing

使用文档作为指南,您应该能够设置一个可以检查响应内容的测试用例。

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是您的应用/项目的名称。

答案 2 :(得分:4)

Flask official documentation建议您使用template_rendered signal (自0.6版以来可用)对模板进行单元测试以及用于渲染模板的变量。

  

例如,这里有一个帮助器上下文管理器,可以在unittest中用来确定呈现了哪些模板以及传递给模板的变量:

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

答案 3 :(得分:1)

您可能希望在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 page

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