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
相关产品推荐
相关产品推荐

