【发布时间】:2021-07-30 07:52:12
【问题描述】:
我使用模型的 sqlalchemy 应用程序
## example file
## models.py -- path : app/models.py
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'User'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
class Book(db.Model):
__tablename__ = 'Book'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True, nullable=False)
owned_by = = db.Column(BigInt, db.ForeignKey('User.id'))
## i want to mock `user` and `book` returns by query
def check_user_own_book(user_id):
user = db.query.session(
User.id,
User.username,
).filter(
User.id == user_id
).one_or_none()
## more logic. abc
book = db.query.session(
Book.id,
Book.name,
).filter(
owned_by == user.id
).one_or_none()
## more logic
这是我的测试
from unittest import MagicMock, mock
def test_mock_session_query(fixture_user, fixture_book, session ):
# fixture_user , fixture_book are fixture object
# session is inited in confest.py
with mock.patch('flask_sqlalchemy._QueryProperty.__get__') as mock_model:
mock_model.filter.return_value.one_or_none.return_value = fixture_user
## let test
# query_user_with_session return None (which is true because there is no such user with id == 1000)
# -> Why do mock_model does not work and how to mock this `session.query` (1)
query_user_with_session = session.query(User.id, User.username).filter(User.id==1000).one_or_none()
# query_user_with_class returns fixture_user correctly with what we mocked
query_user_with_class = User.query.filter(User.id==1).one_or_none()
# query_book_with_class returns fixture_user (2)
query_user_with_session = Book.query.filter(Book.id=10000).one_or_none()
has_own_book = check_user_own_book(user_id=1) # this will fail because all query with one_or_none will return fixture_user
我已经为此研究了几天,但仍然没有任何答案:
-
Model.query和session.query(Model)的行为不同。那么模拟后一个的技术是什么 -
如何根据参数模拟
session.query(Model.column1, Model.columns2)的return_value。例如:session.query(Model.column1, Model.columns2)和session.query(Model_2.column1, Model_2.columns2)的返回值应该不同
【问题讨论】:
标签: python sqlalchemy mocking flask-sqlalchemy python-unittest