您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用SQLAlchemy设置Flask应用程序进行测试?

如何使用SQLAlchemy设置Flask应用程序进行测试?

您使用环境变量的本能是正确的。但是,存在使用错误数据库运行单元测试的危险。另外,您可能不想在connect_db每个请求中都想使用任何地方db。您可以使用配置目录和明确设置的环境变量。这是到目前为止我提出的最好的。

run.py
shell.py

config/__init__.py
config/test.py
config/postgres.py
...

main/__init__.py
main/someapp/__init__.py
main/someapp/models.py

...
main/tests/__init__.py
main/tests/testutils.py

因此,配置文件可能是:

# config/test.py
sqlALCHEMY_DATABASE_URI = "sqlite://"

# config/postgres.py
sqlALCHEMY_DATABASE_URI = 'postgresql://user:pw@localhost/somedb'

因此,我可以在基本TestCase中显式设置数据库

import os
from flask.ext.testing import TestCase

os.environ["DIAG_CONfig_MODULE"] = "config.test"
from main import app, db


class sqlAlchemyTest(TestCase):

    def create_app(self):
        return app

    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

然后,main/__init__.py对我来说:

import os

from flask import Flask, render_template, g
from flask.ext.sqlalchemy import sqlAlchemy

# by default, let's use a DB we don't care about
# but, we can override if we want
config_obj = os.environ.get("DIAG_CONfig_MODULE", "config.test")
app = Flask(__name__)
app.config.from_object(config_obj)
db = sqlAlchemy(app)

@app.before_request
def before_request():
    g.db = db
    g.app = app

# ...
@app.route('/', methods=['GET'])
def get():
    return render_template('home.html')
# ...    
from main.someapp.api import mod as someappmod
app.register_blueprint(someappmod)

然后,在其他文件中,我可能会知道要运行什么配置:

# run.py
import os
os.environ["DIAG_CONfig_MODULE"] = "config.postgres"
from main import app
app.run(debug=True)

# shell.py
import os
os.environ["DIAG_CONfig_MODULE"] = "config.postgres"

from main import app, db
from main.symdiag.models import *
from main.auth.models import *
print sorted(k for k in locals().keys() if not k.startswith("_"))
import IPython
IPython.embed()

也许到目前为止最好。

Python 2022/1/1 18:41:29 有269人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶