Python SQLAlchemy 模拟
Python SQLAlchemy mocking
这是我进行链式数据库查询调用的方法。
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
好像我在嘲笑的时候做错了什么。我的错误是什么?我检查了文档。
你只是在嘲笑错误的东西,并断言调用链应该 return 一个包含给定项目的实际列表,而不是一个神奇的模拟对象。而不是 execute
,它只是模拟对同名属性的访问,您应该使用 return_value
,就像您在最后一步中所做的那样。给定链条
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]
您可以使用炼金术模拟来模拟 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))
这是我进行链式数据库查询调用的方法。
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
好像我在嘲笑的时候做错了什么。我的错误是什么?我检查了文档。
你只是在嘲笑错误的东西,并断言调用链应该 return 一个包含给定项目的实际列表,而不是一个神奇的模拟对象。而不是 execute
,它只是模拟对同名属性的访问,您应该使用 return_value
,就像您在最后一步中所做的那样。给定链条
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]
您可以使用炼金术模拟来模拟 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))