我正在为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
异常。
我怎么能告诉测试在哪里找到相应的模板?使用Flask-testing绕过模板渲染并不是一种选择......
答案 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)
....