Насмешка методов и sqlalchemy (psycopg2)Python

Программы на Python
Ответить
Anonymous
 Насмешка методов и sqlalchemy (psycopg2)

Сообщение Anonymous »

У меня есть метод, который выполняет некоторую работу, возвращает некоторое значение и передает его в запрос sqlalchemy.
В случае теста я пытаюсь имитировать этот метод, но получил исключение: sqlalchemy.exc.ProgrammingError: ( psycopg2.ProgrammingError) не может адаптировать тип MagicMock

У меня есть код, который выглядит следующим образом:

Код: Выделить всё

from mock import patch
from sqlalchemy import Integer, Column

from pr.core.model import Base
from pr.core.model import Session

class SomeModel(Base):
__tablename__ = 'table'
id = Column(Integer, primary_key=True)

class SomeObj(object):
def some_method(self):
return 1

def call(self):
return Session.query(SomeModel).filter(SomeModel.id == self.some_method()).all()

def main():
with patch('__main__.SomeObj.some_method') as mocked:
SomeObj().call()
assert mocked.called
if __name__ == '__main__':
main()
После вызова такого кода я получил такую ​​трассировку:

Код: Выделить всё

Traceback (most recent call last):
File "/home/anton/Projects/pr/core/run/stuff.py", line 26, in 
main()
File "/home/anton/Projects/pr/core/run/stuff.py", line 23, in main
SomeObj().call()
File "/home/anton/Projects/pr/core/run/stuff.py", line 18, in call
return Session.query(SomeModel).filter(SomeModel.id == self.some_method()).all()
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2613, in all
return list(self)
File "/home/anton/Projects/pr/core/model/cachingquery.py", line 74, in __iter__
return Query.__iter__(self)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2761, in __iter__
return self._execute_and_instances(context)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2776, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute
return meth(self, multiparams, params)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
compiled_sql, distilled_params
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
context)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
exc_info
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
context)
File "/home/anton/Projects/pr/.venv/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'MagicMock' [SQL: 'SELECT "table".id AS table_id \nFROM "table" \nWHERE "table".id = %(id_1)s'] [parameters: {'id_1': }]
Есть ли способ правильно имитировать метод?

Подробнее здесь: https://stackoverflow.com/questions/433 ... y-psycopg2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»