3

我正在为大致具有以下组织的 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模块是否按预期工作。

我已经定义了以下内容:

  • special/views.py

    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
    

虽然应用程序本身工作正常,但test_connect单元测试失败并出现TemplateNotFound: special/index_special.html异常。

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

4

1 回答 1

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)
        ....
于 2013-05-28T14:48:37.930 回答