unit-testing - 如何从 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")
正确的做法。但是我很困惑,文档没有涵盖这种情况。
解决方案
当您收到错误消息时, 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
推荐阅读
- python - 在 Keras 中检查模型输入以获取验证数据时出错
- javascript - 合并(更新)数组中的相同对象
- java - Jersey MultiPartRequest 接收 null
- html - 垂直对齐不适用于纯文本?
- php - OpenLDAP PHP 添加生日属性
- git - 带有 Git 的 Azure Devops 仅建议对最新提交的拉取请求
- javascript - 未捕获的类型错误:无法读取 null 的属性“linkWithCredential”
- javascript - Firebase Cloud Function with Google Secrets Manager 如何让 async/await 工作
- java - 弹性搜索稳定版
- mysql - 如何在 Windows 中将 C 程序与 MySQL 数据库连接并编写代码?