Я не думаю, что вы действительно получаете большую выгоду, используя насмешки для тестирования ваших запросов.Тестирование должно быть проверкой логики кода, а не реализации .Лучшим решением было бы создать новую базу данных, добавить в нее несколько объектов, выполнить запрос к этой базе данных и определить, возвращаете ли вы правильные результаты.Например:
# Create the engine. This starts a fresh database
engine = create_engine('sqlite://')
# Fills the database with the tables needed.
# If you use declarative, then the metadata for your tables can be found using Base.metadata
metadata.create_all(engine)
# Create a session to this database
session = sessionmaker(bind=engine)()
# Create some posts using the session and commit them
...
# Test your repository object...
repo = PostRepository(session)
results = repo.find_latest()
# Run your assertions of results
...
Теперь вы фактически тестируете логику кода.Это означает, что вы можете изменить реализацию вашего метода, но пока запрос работает правильно, тесты все равно должны пройти.Если вы хотите, вы можете написать этот метод как запрос, который получает все объекты, а затем нарезает результирующий список.Тест пройдет, как и должно быть.Позже вы можете изменить реализацию для выполнения запроса с использованием API-выражений SA, и тест будет пройден.
Следует иметь в виду, что у вас могут быть проблемы с поведением sqlite, отличным от другого типа базы данных,Использование sqlite в памяти дает вам быстрые тесты, но если вы хотите серьезно относиться к этим тестам, вы, вероятно, захотите запускать их для тех же типов баз данных, которые вы будете использовать и в рабочей среде.