【问题标题】:Python SQLAlchemy mockingPython SQLAlchemy 模拟
【发布时间】:2018-11-10 07:30:22
【问题描述】:

这是我进行链式数据库查询调用的一种方法。

import math
def get_all_keys():
    db_session = DBSession()
    keys = db_session.query(SomeClass).all()

我应该模拟DBSession().query(SomeClass).all()。我尝试了一些,但没有任何效果。这是我的试验。

@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 时出现以下错误。

    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

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

【问题讨论】:

    标签: python unit-testing sqlalchemy python-unittest python-unittest.mock


    【解决方案1】:

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

    DBSession().query(...).all()
    

    你应该在嘲笑

    DBSession.return_value.query.return_value.all.return_value = [1, 2, 3]
    

    另一方面,test_asd() 在你正在做的断言中

    DBSession.query(...).all()
    

    所以

    DBSession.query.return_value.all.return_value = [1, 2, 3]
    

    【讨论】:

      【解决方案2】:

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

      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])
      

      您也可以选择模拟数据

      db_session.add(SomeClass(column1=1, column2=2, column3=3))
      

      【讨论】:

      猜你喜欢
      • 2016-05-28
      • 2011-07-04
      • 2016-12-25
      • 1970-01-01
      • 2019-06-13
      • 2016-07-28
      • 2018-04-02
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多