【发布时间】:2021-08-12 20:16:21
【问题描述】:
我知道,这是一口。
我正在使用 pytest-asyncio,它为您提供了一个异步事件循环,用于在您的测试中运行异步代码。
我想使用带有异步 ORM 的 factory-boy。唯一的问题是 factory-boy 不支持异步。我想覆盖工厂上的_create 函数(这是一个同步函数),但是,我需要该函数来运行异步代码。是否阻塞无关紧要,只是测试。
类似这样的:
class AsyncModelFactory(factory.alchemy.SQLAlchemyFactory):
class Meta:
sqlalchemy_session = async_session
abstract = True
@classmethod
def _create(cls, model_class, *args, **kwargs):
# run_until_complete only works if there isn't already an event loop running
return asyncio.get_event_loop().run_until_complete(
cls._async_create(model_class, *args, **kwargs)
)
@classmethod
async def _async_create(cls, model_class, *args, **kwargs):
obj = model_class(*args, **kwargs)
session = self._meta.sqlalchemy_session
session.add(obj)
await session.commit() # needs to be awaited
return obj
上述方法确实有效,除非异步事件循环已经在运行。具有讽刺意味的是,该工厂通过同步测试工作,而不是通过异步测试工作。
有没有办法在异步上下文中从 _create 等待 _async_create?所有带有创建子工厂等的工厂的工厂男孩都是同步的,所以这只有在_create 保持同步调用时才有效
【问题讨论】:
标签: python python-asyncio