【问题标题】:How to access the database from unit test in Fast API?如何从 Fast API 中的单元测试访问数据库?
【发布时间】:2021-01-31 18:20:06
【问题描述】:

在 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: 'generator' 对象没有属性 'query'

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

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") 是正确的做法。但是我很困惑,文档没有涵盖这种情况。

【问题讨论】:

  • 看起来 FastAPI 中的 dependency_overrides 仅在使用 Depends 使用依赖注入时才有效。我在提供的代码中没有看到这一点。

标签: unit-testing sqlalchemy fastapi


【解决方案1】:

当您收到错误 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

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多