Python SQLAlchemy насмешливый - PullRequest
0 голосов
/ 31 мая 2018

это метод, который я сделал с помощью связанных запросов к БД.

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

Похоже, я что-то не так сделал во время издевательства.В чем моя ошибка?Я проверил документацию.

1 Ответ

0 голосов
/ 31 мая 2018

Вы просто издеваетесь не над тем, и утверждаете, что цепочка вызовов должна возвращать реальный список с заданными предметами, а не волшебный поддельный объект.Вместо 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]
...