У меня есть метод, который выполняет некоторую работу, возвращает некоторое значение и передает его в запрос 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': }]
У меня есть метод, который выполняет некоторую работу, возвращает некоторое значение и передает его в запрос sqlalchemy. В случае теста я пытаюсь имитировать этот метод, но получил исключение: sqlalchemy.exc.ProgrammingError: ( psycopg2.ProgrammingError) не может адаптировать тип MagicMock
У меня есть код, который выглядит следующим образом:
[code]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 main(): with patch('__main__.SomeObj.some_method') as mocked: SomeObj().call() assert mocked.called if __name__ == '__main__': main() [/code]
После вызова такого кода я получил такую трассировку:
[code]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': }] [/code]