首页 > 解决方案 > 如何从 Fast API 中的单元测试访问数据库?

问题描述

在 Fast API 中进行单元测试时,我正在努力访问 SQLAlchemy。

def test_successful_register_ios():
    response = client.post("/register/",headers={},json={})
    assert response.status_code == 201
    device = get_db().query(Device).get("a1")
    assert device.expires_at == mydate

AttributeError:“生成器”对象没有属性“查询”

在我的测试类中,我正在应用所有覆盖:

from database.database import Base
from main import app, get_db

settings = Settings()
engine = create_engine(settings.sqlalchemy_database_uri)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base.metadata.create_all(bind=engine)
client = TestClient(app)

def override_get_db():
    try:
        db = TestingSessionLocal()
        yield db
    finally:
        db.close()

app.dependency_overrides[get_db] = override_get_db

我认为这不是get_db().query(Device).get("a1")正确的做法。但是我很困惑,文档没有涵盖这种情况。

标签: unit-testingsqlalchemyfastapi

解决方案


当您收到错误消息时, AttributeError: 'generator' object has no attribute 'query'python 告诉您结果get_db()不是 sqlalchemy 会话对象,而是生成会话对象的生成器。

尝试调用next()您的生成器以从生成器中获取会话。

def test_successful_register_ios():
    response = client.post("/register/",headers={},json={})
    assert response.status_code == 201
    device = next(get_db()).query(Device).get("a1")
    assert device.expires_at == mydate

推荐阅读