您将必须模拟整个mapper类。访问
query映射器上的属性会导致会话负载:
@patch('app.model.some_model.SomeModel')def test_some_case(self, some_model_mock): filter_by_mock = some_model_mock.query.filter_by # more test logic goes here那是因为
.query属性是一个描述符对象。访问它会触发与会话的绑定。
另一种方法是模拟
_QueryProperty.__get__方法(支持
.query属性)。仅在
必须 使用实际
SomeModel实例进行测试时才使用此选项:
@patch('flask_sqlalchemy._QueryProperty.__get__')def test_some_case(self, query_property_getter_mock): filter_by_mock = query_property_getter_mock.return_value.filter_by # more test logic goes here演示:
>>> from flask_sqlalchemy import SQLAlchemy>>> db = SQLAlchemy()>>> class SomeModel(db.Model):... id = db.Column(db.Integer, primary_key=True)...>>> from unittest import mock>>> with mock.patch('__main__.SomeModel') as model_mock:... filter_by = model_mock.query.filter_by... SomeModel.query.filter_by(SomeModel.id == 'foo')...<MagicMock name='SomeModel.query.filter_by()' id='4438980312'>>>> with mock.patch('flask_sqlalchemy._QueryProperty.__get__') as query_property_getter_mock:... filter_by_mock = query_property_getter_mock.return_value.filter_by... SomeModel.query.filter_by(SomeModel.id == 'foo')...<MagicMock name='__get__().filter_by()' id='4439035184'>


