【发布时间】:2021-11-18 11:18:54
【问题描述】:
我正在为我的 Flask Web 应用程序编写测试,并在尝试测试与数据库交互的端点时遇到了错误。
我的client 夹具试图遵循Flask's testing tutorial 的精神:
DATABASE = {
"engine": "SqliteDatabase",
"name": ":memory:",
}
@pytest.fixture
def client():
app = create_app({"TESTING": True, "DATABASE": DATABASE})
with app.test_client() as client:
with app.app_context():
db_wrapper.init_app(app)
init_database()
yield client
但是在尝试运行最简单的测试时,
def test_test_endpoint(client):
client.post("/test")
我收到peewee.OperationalError: Connection already opened.
我已经知道db_wrapper 在我调用init_database 时会打开一个连接,并且connect_db 是由FlaskDB 包装器设置的Flask 的preprocess_request 调用的。
为了测试,即使它会擦除我的 SQLite 内存数据库中的所有数据,我尝试在 init_database 之后调用 db_wrapper.database.close(),但得到了同样的错误,所以即使有一个 in-内存测试数据库不太理想,看来我的问题无法通过将数据移动到磁盘来解决。
【问题讨论】:
-
什么是
db_wrapper?db_wrapper.init_app()是做什么的?您是否安装了在每个请求上打开/关闭数据库的请求挂钩?内存数据库只在连接期间存在,因此您必须确保在测试期间不要关闭它。 -
嗨@coleifer!感谢您的回复,我喜欢您的项目!
db_wrapper是FlaskDB的一个实例。我仔细阅读了playhouse/flask_utils.py中的代码,我知道在调用db_wrapper.init_app()时它会在内部调用_register_handlers(app),它会安装挂钩来打开/关闭数据库连接。在使用FlaskDB包装器时,您所描述的情况是否可能“因此您必须确保在测试期间不会关闭它”?我的意思是,内部调用create_tables的init_database已经打开了数据库,关闭连接意味着数据消失了。