首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python SQLAlchemy模拟

Python SQLAlchemy模拟
EN

Stack Overflow用户
提问于 2018-05-31 18:04:11
回答 2查看 17K关注 0票数 9

这是我进行链式DB查询调用的方法。

代码语言:javascript
复制
import math
def get_all_keys():
    db_session = DBSession()
    keys = db_session.query(SomeClass).all()

我应该嘲笑DBSession().query(SomeClass).all()。我试过了,但都不管用。以下是我的试验。

代码语言:javascript
复制
@patch('app.modules.somemodule.DBSession')
def test_asd(self, DBSession):
    DBSession.execute.query.execute.all.return_value = [1, 2, 3]
    self.assertListEqual(DBSession.query('qwe').all(), [1, 2, 3])

在这个尝试中,如果我尝试打印DBSession(),我会得到一个MagicMock对象,看起来还不错。但是当我运行pytest时,我得到了以下错误。

代码语言:javascript
复制
    self = <test_some_module.SomeModuleTests testMethod=test_asd>, DBSession = <MagicMock name='DBSession' id='140028663111976'>

    @patch('app.modules.somemodule.DBSession')
    def test_asd(self, DBSession):
        DBSession.execute.query.execute.all.return_value = [1, 2, 3]
        print(DBSession().query('qwe').all())
>       self.assertListEqual(DBSession.query('qwe').all(), [1, 2, 3])
E       AssertionError: First sequence is not a list: <MagicMock name='DBSession.query().all()' id='140028662649184'>

tests/test_some_module.py:21: AssertionError

好像我在嘲笑的时候做错了什么。我的错误是什么?我查过文档了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 18:10:33

您只是在模仿错误的东西,并断言调用链应该返回一个包含给定项目的实际列表,而不是一个神奇的模仿对象。您应该像在最后一步中所做的那样,使用return_value,而不是简单地模拟对同名属性的访问的execute。给定链

代码语言:javascript
复制
DBSession().query(...).all()

你应该嘲笑我

代码语言:javascript
复制
DBSession.return_value.query.return_value.all.return_value = [1, 2, 3]

另一方面,在test_asd()中,您所做的断言

代码语言:javascript
复制
DBSession.query(...).all()

所以

代码语言:javascript
复制
DBSession.query.return_value.all.return_value = [1, 2, 3]
票数 6
EN

Stack Overflow用户

发布于 2020-02-20 22:37:56

您可以使用炼金术模拟来模拟SQLAlchemy的会话和数据

代码语言:javascript
复制
from alchemy_mock.mocking import UnifiedAlchemyMagicMock
db_session = UnifiedAlchemyMagicMock()
db_session.query.return_value.all.return_value = [1,2,3]

mock_res = test_asd(db_session)
self.assertEqual(mock_res, [1,2,3])

您还可以通过以下方式模拟数据:

代码语言:javascript
复制
db_session.add(SomeClass(column1=1, column2=2, column3=3))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50621689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档