首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不能在“等待”表达式中使用Python - object MagicMock

不能在“等待”表达式中使用Python - object MagicMock
EN

Stack Overflow用户
提问于 2018-07-18 05:49:41
回答 6查看 28.3K关注 0票数 38

当我试图用MagicMock在单元测试中模拟异步函数时,我得到了以下异常:

TypeError:对象MagicMock不能用于“等待”表达式

使用示例代码,如:

代码语言:javascript
代码运行次数:0
运行
复制
# source code
class Service:
    async def compute(self, x):
        return x

class App:
    def __init__(self):
        self.service = Service()

    async def handle(self, x):
        return await self.service.compute(x)

# test code
import asyncio
import unittest
from unittest.mock import patch


class TestApp(unittest.TestCase):
    @patch('__main__.Service')
    def test_handle(self, mock):
        loop = asyncio.get_event_loop()
        app = App()
        res = loop.run_until_complete(app.handle('foo'))
        app.service.compute.assert_called_with("foo")

if __name__ == '__main__':
    unittest.main()

我应该如何用内置的python3库修复它?

EN

回答 6

Stack Overflow用户

发布于 2018-07-18 10:32:40

最后我被黑客袭击了。

代码语言:javascript
代码运行次数:0
运行
复制
# monkey patch MagicMock
async def async_magic():
    pass

MagicMock.__await__ = lambda x: async_magic().__await__()

它只适用于MagicMock,而不适用于其他预定义的return_value。

票数 27
EN

Stack Overflow用户

发布于 2020-08-15 18:32:04

在python 3.8+中,您可以使用AsyncMock

代码语言:javascript
代码运行次数:0
运行
复制
async def test_that_mock_can_be_awaited():
   mock = AsyncMock()
   mock.x.return_value = 123
   result = await mock.x()
   assert result == 123

AsyncMock对象的行为将使对象被识别为异步函数,并且调用的结果是可接受的。

代码语言:javascript
代码运行次数:0
运行
复制
>>> mock = AsyncMock()
>>> asyncio.iscoroutinefunction(mock)
True
>>> inspect.isawaitable(mock())
True
票数 27
EN

Stack Overflow用户

发布于 2019-01-22 02:09:32

您可以获得模拟来返回可以使用未来等待的对象。下面是一个吡喃测试用例,但是使用单位测试应该有类似的东西。

代码语言:javascript
代码运行次数:0
运行
复制
async def test_that_mock_can_be_awaited():
    mock = MagicMock(return_value=Future())
    mock.return_value.set_result(123)
    result = await mock()
    assert result == 123

在您的例子中,由于您正在修补Service (它作为mock传入),mock.return_value = Future()应该能做到这一点。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51394411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档