如何测试函数是不是使用 async 关键字调用

Posted

技术标签:

【中文标题】如何测试函数是不是使用 async 关键字调用【英文标题】:How to test if function is called with async keyword如何测试函数是否使用 async 关键字调用 【发布时间】:2021-12-29 02:18:55 【问题描述】:

我想为我的 vue3 应用编写一个简单的测试,测试应该断言 特定功能(在这种情况下为 updateRoute)在不同组件中使用 async 声明 p>

注意:根据我目前的项目,我无法将此函数隔离在单个文件中以使其可重用

示例:

const updateRoute = () =>  doSomethig() 

应该失败

同时

const updateRoute = async () =>  await doSomethig() 

应该通过

测试库无所谓,可以是 Jest 也可以是其他任何东西

【问题讨论】:

没有显示什么是 doSomethig 以及如何使用 updateRoute。可以用linter解决。这可能是 XY 问题。即使知道 updateRoute 返回了一个 Promise,也不知道它返回了一个正确的 Promise,即等待 doSomethig。一般来说,最好断言使用 updateRoute 的地方可以正常工作,即 doSomethig 的副作用在正确的时间应用。 【参考方案1】:

检查函数的contructor.name是否等于'AsyncFunction'

const x = async () => ;
const y = () => 

console.log(x.constructor.name);
console.log(x.constructor.name === 'AsyncFunction');

console.log(y.constructor.name);
console.log(y.constructor.name === 'AsyncFunction');

【讨论】:

【参考方案2】:

有no reliable way and no reason检测async功能。对于返回 Promise 的函数,它与以下内容相同:

const updateRoute = () => 
  return doSomethig().then(() => ) // Returns a promise of undefined

应该测试updateRoute 是否返回一个promise,async 与否。开玩笑的是:

expect(updateRoute()).toEqual(expect.any(Promise));

至于强制await,必要时可以用ESLint require-await rule处理。

【讨论】:

以上是关于如何测试函数是不是使用 async 关键字调用的主要内容,如果未能解决你的问题,请参考以下文章

测试从常规函数调用 python 协程(async def)

如何测试使用 async/await 的方法?

在 FastAPI 中使用 `async def` 与 `def` 并测试阻塞调用

在单元测试中同步调用异步方法是不是不正确?

在 django 中使用 sync_to_async 时如何运行协程函数?

测试一个函数是不是被调用