You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-SQLAlchemy 3.x版本pytest mock查询方法报错的解决咨询

适配Flask-SQLAlchemy 3.x的mock方案

Flask-SQLAlchemy 3.x重构了内部实现,移除了旧版本里的flask_sqlalchemy._QueryProperty类,这就是你之前mock方式失效的原因。不用降级,直接换以下几种mock方式就行:

方式1:直接mock模型的query.get方法

如果你的代码里是通过模型类.query.get()来查询的,直接mock这个get方法就行:

def test_get_model(mocker):
    # 构造模拟的模型实例
    mock_instance = YourModel(id=1, field="test")
    # mock模型的query.get方法,指定返回值
    mocker.patch.object(YourModel.query, 'get', return_value=mock_instance)
    
    # 调用你要测试的业务函数,比如 get_item(1)
    result = get_item(1)
    
    # 断言结果符合预期
    assert result.id == 1
    assert result.field == "test"
    # 验证get方法被调用了一次,参数是1
    YourModel.query.get.assert_called_once_with(1)

方式2:mock db.session.query的返回结果

如果代码里用的是db.session.query(YourModel).get()这种写法,就需要先mock query方法返回的查询对象,再mock它的get方法:

def test_get_via_session(mocker):
    mock_instance = YourModel(id=2, field="another test")
    # 创建一个模拟的query对象
    mock_query = mocker.Mock()
    mock_query.get.return_value = mock_instance
    # mock db.session.query,让它返回我们的模拟query对象
    mocker.patch.object(db.session, 'query', return_value=mock_query)
    
    result = get_item_via_session(2)
    
    assert result.id == 2
    # 验证query方法被调用时传入了YourModel
    db.session.query.assert_called_once_with(YourModel)
    # 验证get方法被调用了一次,参数是2
    mock_query.get.assert_called_once_with(2)

注意事项

  • 3.x版本里,模型的query属性已经是SQLAlchemy原生的Query对象,不再依赖旧的_QueryProperty,所以直接mock对应方法更稳定,也更贴合新版本的设计。
  • 尽量避免mock私有类或内部实现,这类内容在版本迭代中很容易变动,像这次的_QueryProperty被移除就是例子。

内容的提问来源于stack exchange,提问作者Leonardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:25:19