pytest-flask-sqlalchemy icon indicating copy to clipboard operation
pytest-flask-sqlalchemy copied to clipboard

Reflection does not work

Open fgregg opened this issue 4 years ago • 0 comments
trafficstars

Code that uses SQLAlchemy's Reflection facilities won't work with a monkey patched database engine.

code like this:

messages = Table('messages', meta, autoload_with=engine)

raises the error sqlalchemy.exc.NoInspectionAvailable: No inspection system is available for object of type <class 'unittest.mock.MagicMock'>

The relevant SQLAlchemy code is here: https://github.com/sqlalchemy/sqlalchemy/blob/52e8545b2df312898d46f6a5b119675e8d0aa956/lib/sqlalchemy/sql/schema.py#L693-L718

it might be enough to

Register the mocked engine in the sqlalchemy.inspections._registrars dictionary. You would need to specialize the MagickMock class when setting up the db_engine to make sure we get a handle on just the mocked engine. something like:

class EngineMock(mocker.MagickMock):
    pass
engine = EngineMock(spec=sa.engine.Engine)
sqlalchemy.inspections._registrars[EngineMock] = sqlalchemy.engine.Inspector._engine_insp

=

fgregg avatar Sep 24 '21 19:09 fgregg