我正在尝试为使用"async with"语句的方法编写测试(在这种情况下,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
我收到这个错误:
>等待conn.set("key",value)
E TypeError:object NoneType不能在'await'表达式中使用
Tadhg McDona.. 6
__aexit__
需要也是异步的(需要返回等待的):
async def __aexit__(self, exc_type, exc_val, exc_tb): pass
没有异步它返回None
而不是协程因此它引发错误,因为我创建此问题的非常误导的错误消息指出错误消息需要修复.
__aexit__
需要也是异步的(需要返回等待的):
async def __aexit__(self, exc_type, exc_val, exc_tb): pass
没有异步它返回None
而不是协程因此它引发错误,因为我创建此问题的非常误导的错误消息指出错误消息需要修复.