使用 pytest 模拟 SQLAlchemy 数据库 URI



我有一个通过应用程序工厂方法创建的 Flask 应用程序:

应用名称/__init__.py

from flask import Flask
def create_app():
    app = Flask(__name__)
    with app.app_context():
        from appname.db import db_session
    @app.teardown_appcontext
    def shutdown_session(exception=None):
        db_session.remove()
    return app
if __name__ == "__main__":
    app = create_app()
    app.run(port=5050)

我的数据库的 URI 存储在环境变量中,并使用标准 SQLAlchemy 样板创建:

应用名称/数据库.py

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import os
engine = create_engine(os.environ.get('DATABASE_URI'), echo=True)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
    Base.metadata.create_all(bind=engine)

此设置适用于开发,但我无法弄清楚如何为 pytest 设置DATABASE_URI变量。现在我必须指定它以及pytest命令:

DATABASE_URI='postgresql://me@localhost/appname' pipenv run pytest

虽然这有效,但我必须想象有一种更好的方法来为我的测试套件预定义环境。设置这些环境变量的最佳实践方法是什么?

似乎有效:

测试/混淆.py

import pytest
from _pytest import monkeypatch
from appname import create_app

@pytest.fixture
def client():
    mp = monkeypatch.MonkeyPatch()
    mp.setenv('DATABASE_URI', 'postgresql://me@localhost/appname')
    app = create_app()
    client = app.test_client()
    yield client

最新更新