我的申请有效。只有doctests不起作用。
在应用程序中,我使用模式
from models import db
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://..."
db.init_app(app)
...
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', threaded=True)
我有几个非常简单的doctests。在从Flask + Sqlalchemy切换到flask-sqlalchemy之前,它有效:
>>> import database
>>> files_insert(..., no_commit=True) # database stuff happens here
>>> database.session.rollback()
可以删除插入测试(它们可能没有太多意义),但我有几个函数只需要从数据库中选择元素。这应该仍然有效。但我明白了:
RuntimeError: application not registered on db instance and no applicationbound to current context
有没有办法配置我的应用程序,以便文档字符串始终获取应用程序上下文?
答案 0 :(得分:0)
您的doctest缺少应用程序上下文,因为您使用flask-sqlalchemy,您已绑定了应用程序实例和数据库实例。检查this issue。
解决方法(实际上是一个黑客攻击方法)是修补flask会话,请求和current_app对象,查看this comment on the same issue为pytest
修补它。
但恕我直言,当你开始以这种方式进行黑客攻击时,是时候切换到常规测试方法,单元测试或pytest。
虽然doctest
对于简单的代码很有用,但是当你必须破解和/或设置一个完整的上下文来运行doctest时,你仍然会失去它的简单性......