【发布时间】:2020-12-07 14:46:35
【问题描述】:
我只是想让 FastAPI 单元测试与 SQLAlchemy 一起工作,但我在测试数据库中创建的对象时遇到了麻烦。根据docs,我有以下设置。
main.py
routes = [
APIRoute('/games/', views.games_list, name='index', response_class=HTMLResponse),
]
settings = Settings()
app = FastAPI(debug=settings.debug, routes=routes)
views.py
# Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
async def games_list(request: Request, db: Session = Depends(get_db)):
settings = Settings()
games = db.query(Game).all()
return settings.templates.TemplateResponse('games/list.jinja', {'request': request, 'games': games})
数据库.py
def prepare_database(settings):
engine = create_engine(settings.database_url)
Base.metadata.create_all(engine)
return engine
engine = prepare_database(delete_existing=False, settings=Settings())
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
conftest.py
@pytest.fixture
def db_conn():
session = SessionLocalTesting()
try:
yield session
finally:
session.close()
@pytest.fixture
def cli(db_conn):
def override_get_db():
session = SessionLocalTesting()
try:
yield session
finally:
session.close()
app.dependency_overrides[get_db] = override_get_db
with TestClient(app) as client:
yield client
测试文件
def test_games_list(cli, factory, db_conn):
factory.create_game()
# This will return the game I have created with my factory, definitely in the test db.
print(db_conn.query(Game.name).all())
r = cli.get('/games/')
assert 'DnD Game' in r.content.decode()
我的问题是我无法从测试数据库中获取对象。如果我在视图中print(db.bind.database.url ) 没有使用测试数据库,那么它会尝试从真实数据库中获取项目,而不是测试数据库。
所以看起来get_db 没有被覆盖,尽管我不确定为什么。
提前致谢
【问题讨论】:
标签: sqlalchemy fastapi