如何测试函数是不是使用 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)
在 FastAPI 中使用 `async def` 与 `def` 并测试阻塞调用