单元测试Flask应用程序时的模板

时间:2013-05-28 14:43:30

标签: python unit-testing templates flask

我正在为Flask应用程序编写单元测试,该应用程序大致具有以下组织:

/myapplication
    runner.py
    /myapplication
        __init__.py
    /special
        __init__.py
        views.py
        models.py
    /static
    /templates
        index.html
        /special
            index_special.html
    /tests
        __init__.py
        /special
            __init__.py
            test_special.py

特别是,我想测试special模块是否按预期工作。

我定义了以下内容:

    <{1}}中的
  • special/views.py
  • <{1}}中的
  • mod = Blueprint('special', __name__, template_folder="templates")
    @mod.route('/standard')
    def info():
        return render_template('special/index_special.html')
    
  • myapplication/__init__.py

    app = Flask(__name__)
    
    def register_blueprints(app):
         from special.views import mod as special_blueprint
         app.register_blueprint(special_blueprint, url_prefix='/special')
    
    register_blueprints(app)
    

虽然应用程序本身运行良好,但myapplication/tests/test_special.py单元测试失败并出现class TestSpecial: @classmethod def create_app(cls): app = Flask(__name__) register_blueprints(app) return app @classmethod def setup_class(cls): cls.app = cls.create_app() cls.client = cls.app.test_client() def test_connect(self): r = self.client.get('/standard') assert r.status_code == 200 异常。

我怎么能告诉测试在哪里找到相应的模板?使用Flask-testing绕过模板渲染并不是一种选择......

1 个答案:

答案 0 :(得分:2)

您可以将template_folder传递给应用程序对象构造函数:

app = Flask(__name__, template_folder='../templates')

您可能必须使用绝对路径,我不确定。

http://flask.pocoo.org/docs/api/#flask.Flask

我主要倾向于使用我的应用程序代码使用create_app函数,并在我的测试中使用它,这样应用程序对象就是一致的。如果我想测试单个蓝图或者单独的小东西,我只会创建一个单独的应用程序。

def create_app(conf_obj=BaseSettings, conf_file='/etc/mysettings.cfg'):
    app = Flask(__name__)
    app.config.from_object(conf_obj)
    app.config.from_pyfile(conf_file, silent=True)
    .... blueprints etc
    return app

然后在我的测试中:

class TestFoo(unittest.TestCase):

    def setUp(self):
        self.app = create_app(TestSettings)
        ....