如何使用&q;语句模拟异步(&Q;)? [英] How to mock "async with" statements?
本文介绍了如何使用&q;语句模拟异步(&Q;)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试为使用";Async With&Quot;语句的方法编写测试(在本例中,是aioredis的连接池),我想模拟与redis的连接,但我弄不清楚如何进行。
以下是我到目前为止的情况:
from asyncio import Future
from unittest.mock import MagicMock
import pytest
# The thing i'm trying to test
async def set_value(redis, value):
# Do things
async with redis.get() as conn:
await conn.set("key", value)
#My Mock classes
class MockRedis():
def get(self):
return MockAsyncPool()
class MockAsyncPool(MagicMock):
async def __aenter__(self):
conn = MagicMock()
f = Future()
f.set_result(True)
conn.set = MagicMock(return_value=f)
return conn
def __aexit__(self, exc_type, exc_val, exc_tb):
pass
# The actual test
@pytest.mark.asyncio
async def test_get_token():
redis = MockRedis()
token = await set_value(redis, 'something')
assert token is not None
我用以下命令运行它:
py.test path/to/file.py
我收到此错误:
>;等待连接集(";key";,value)
E TypeError:对象NoneType不能用于‘Await’表达式
推荐答案
__aexit__
还需要异步(needs to return an awaitable):
async def __aexit__(self, exc_type, exc_val, exc_tb):
pass
如果不是异步的,它将返回None
而不是协程,因此会引发错误,至于我创建的非常误导性的错误消息this issue,以指出错误消息需要修复。
这篇关于如何使用&q;语句模拟异步(&Q;)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文