如何在 Fast API 的单元测试中访问数据库?

Hou*_*man 15 unit-testing sqlalchemy fastapi

我在 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*fee 21

当您收到错误时,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
Run Code Online (Sandbox Code Playgroud)