当前位置: 首页 > 面试题库 >

在python 3.5中模拟异步调用

蔺霄
2023-03-14
问题内容

如何模拟使用一个本地协程到另一本地协程的异步调用unittest.mock.patch

我目前有一个很尴尬的解决方案:

class CoroutineMock(MagicMock):
    def __await__(self, *args, **kwargs):
        future = Future()
        future.set_result(self)
        result = yield from future
        return result

然后

class TestCoroutines(TestCase):
    @patch('some.path', new_callable=CoroutineMock)
    def test(self, mock):
        some_action()
        mock.assert_called_with(1,2,3)

这可行,但看起来很丑。有更多的pythonic方法可以做到这一点吗?


问题答案:

解决方案实际上非常简单:我只需要将__call__模拟方法转换为协程:

class AsyncMock(MagicMock):
    async def __call__(self, *args, **kwargs):
        return super(AsyncMock, self).__call__(*args, **kwargs)

完美运行,当调用模拟时,代码接收本地协程

用法示例:

@mock.patch('my.path.asyncio.sleep', new_callable=AsyncMock)
def test_stuff(sleep):
    # code


 类似资料:
  • 问题内容: 我可以写一个描述符,返回一个可以等待的未来。 现在,我可以用来获取协程中的值。 如何设置此属性? -> SyntaxError:无法分配给等待表达式 -> TypeError:对象NoneType不能在’await’表达式中使用 -> RuntimeWarning:从未等待协程’set‘ 问题答案: 您尝试执行的操作是不可能的(使用Python 3.5)。 虽然返回Future是明智的

  • 问题内容: 我是开玩笑/酶的新手,正尝试模拟对返回Promise的aync函数的调用,该调用是在componentDidMount方法的react组件内进行的。 该测试正在尝试测试componentDidMount将Promise返回的数组设置为状态。 我遇到的问题是,在将数组添加到状态之前,测试已完成并通过。我正在尝试使用“完成”回调来使测试等待,直到承诺解决为止,但这似乎不起作用。 我尝试将E

  • 问题内容: 我想知道是否有一种简单的方法来获取“同步” readline或至少在node.js中获得同步I / O的外观 我用这样的东西,但是很尴尬 取而代之的是,我希望它像这样简单 有用的条件: (a)建议不要使用外部模块或/ dev / stdio文件句柄,我正在向代码提交网站提交代码,但这些代码在那儿不起作用 (b)可以使用异步/等待或生成器 (c)应基于行 (d)不需要在处理之前将整个标准

  • 在我的React项目中,我正在单元测试一个调用另一个异步函数的异步函数。 尽管每次测试时,结果都是一个空的promise{},而不是预期的数据。我在网上找到了很多模拟异步“getJobStatuses”函数结果的实现,但都没有成功(显示了我在这里使用的实现)。为了测试调用它的函数(getAllJobs),模拟该函数结果的正确方法是什么

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?

  • 我有一些异步服务,我想在 Xamarin 应用程序的不同位置调用这些服务。我使用 Prism 从本机 UWP 应用移植我的代码。 前段时间,我能够通过声明制作方法来做到这一点,例如 或者 在那里等候。然而,它停止了工作。 尝试使用GetAwaiter()。GetResault()会阻止执行并导致死锁。 这有点奇怪,考虑到INavigationService.NavigateAsync本身是异步方法