如何使用&q;语句模拟异步(&Q;)? [英] How to mock "async with" statements?

查看:24
本文介绍了如何使用&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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆