【问题标题】:Mock Python async multi function模拟 Python 异步多功能
【发布时间】:2021-08-17 04:58:06
【问题描述】:

如何在 python tornado 框架中模拟异步多功能。我想对异步功能进行单元测试。在异步函数内部,我有一个 await multi() 函数调用。如何修补此多功能以进行单元测试?

from tornado.gen import multi

async def get_session_details(request_param, docs):
     sesson = await multi([doc for doc in docs])
     # session result is [[],[],[],[],[]]
     return session

# unit test
import pytest
from tornodo.gen import multi
import mock

@mock.patch(tornoda.gen.multi)
async def test_get_session(mock_multi)
    mock_multi.return_value = [[],[],[],[],[]]
    session = get_session_detals(request_param, docs)
    assert session[0][session] is None

# The above code I tried but mock multi is not patching with get_session_details.

【问题讨论】:

  • 分享您尝试过的代码。

标签: python async-await microservices tornado


【解决方案1】:

你可以试试

mocker.patch("tornodo.gen.tornodo.gen.multi", return_value = [[],[],[],[],[]])

async def test_get_session(mocker, mock_multi)
    mocker.patch("tornodo.gen.tornodo.gen.multi", return_value = [[],[],[],[],[]])
    session = get_session_detals(request_param, docs)
    assert session[0][session] is None

mocker 在 pytest-mock 中可用, https://pypi.org/project/pytest-mock/

【讨论】:

  • 这不是嘲笑,我再次收到相同的错误消息。
【解决方案2】:

首先,我建议你使用 tornado.testing.AsyncTestCase 和 gen_test 来测试异步代码:

# unit test
from tornado.testing import AsyncTestCase, gen_test

import mock
from your_file import get_session_details

class ExampleTest(AsyncTestCase):
    @gen_test
    def test_get_session_details(self):
        yield get_session_details(None, [])

其次,如果你想模拟一个异步函数,试试这个:

# unit test
import asyncio
import mock

from tornado.testing import AsyncTestCase, gen_test

from your_file import get_session_details

def get_fake_future(return_value: Any = None) -> asyncio.Future:
    """Make a Future object with a expected return value.

    Args:
        return_value (any): the result of the future
    """
    fake_future = asyncio.Future()
    fake_future.set_result(return_value)
    return fake_future

class ExampleTest(AsyncTestCase):
    @mock.patch("your_file.multi", return_value=get_fake_future())
    @gen_test
    def test_get_session_details(self):
        yield get_session_details(None, [])


    
    

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多