python - 单元测试时如何从数据库异步获取记录?
问题描述
在这个单元测试中,我想检查设备是否已经创建并且到期日期是未来 7 天。
database.py
import databases
database = databases.Database(settings.sqlalchemy_database_uri)
单元测试:
from database.database import database
def test_successful_register_expiry_set_to_seven_days():
response = client.post(
"/register/",
headers={},
json={"device_id": "u1"},
)
assert response.status_code == 201
query = device.select(whereclause=device.c.id == "u1")
d = database.fetch_one(query)
assert d.expires_at == datetime.utcnow().replace(microsecond=0) + timedelta(days=7)
因为d
是协程对象,所以它失败并显示以下消息:
AttributeError: 'coroutine' object has no attribute 'expires_at'
而且我不能await
在单元测试中使用。
d = await database.fetch_one(query)
请问我错过了什么?
解决方案
好吧,它永远不会被等待,您的代码在该信号量进入调度程序之前返回协程。
如果您使用的是异步驱动程序,则需要等待它。有什么解决方法吗?是的。
您可以使用asyncio.run(awaitable)
在事件循环中运行协程。
import asyncio
d = asyncio.run(database.fetch_one(query))
如果您有一个当前正在运行的事件循环,您可能希望使用该事件循环。您可以通过 来实现asyncio.get_event_loop()
,这将在运行循环中运行该函数。
import asyncio
asyncio.get_event_loop().run_until_complete(database.fetch_one(query))
您还可以使用@pytest.mark.asyncio
装饰器(请参阅文档)。
@pytest.mark.asyncio
async def dummy():
await some_awaitable()
推荐阅读
- c++ - 如何将字符串文字映射到 C++ 中的类型
- reactjs - 反应路由器 ERR_TOO_MANY_REDIRECTS
- reactjs - 如何在运行时使用 React Native 单击粗体、斜体和下划线按钮为文本添加格式
- python - 试图获取用户输入(要求一个整数)并使其循环,直到用户输入一个整数。尝试使用 While true, try and except
- wordpress - Wocommerce 产品出口进口 WCFM
- python-3.x - 从与 python 中的 spidev 库的 SPI 连接读取 Raspberry Pi 中的数据
- python - Form A import B 和 import A 惹麻烦
- python - 运行多个“if”语句,但一次遇到多个
- woocommerce - 客户切换 - 在 Woocommerce 前端显示/隐藏缺货产品
- c# - WPF 控制背景模糊