使用 Flask 和 PyTest 测试 SqlAlchemy 会话事件



我正在使用 SqlAlchemybefore_flush事件来验证对象,然后再将它们保存在数据库中,如下所示:

from models import db
@event.listens_for(db.session, 'before_flush')
def validateSomething(session, flush_context, instances):
pass

我真的很想测试我在那里做什么。但是,在我的测试中 - 我正在使用 pytest - 使用夹具为每个测试创建一个新会话。它类似于此设置:http://alexmic.net/flask-sqlalchemy-pytest/函数范围的装置在会话旁边创建一个事务,并在拆解期间回滚/删除它们。

由于该事件是在models.db的(作用域(会话上注册的,因此它不会针对测试中使用的会话的事件触发。有没有办法解决这个问题,所以事件在测试期间被触发?

listens_for()允许侦听会话类的所有实例的事件,而不是侦听会话实例。因此,用SignallingSession替换db.session就成功了。

我遇到了同样的问题。取代

@event.listens_for(db.session, 'before_flush')

from sqlalchemy.orm import Session
@event.listens_for(Session, 'before_flush')

为我解决了问题

最新更新