我正在尝试覆盖(猴子补丁)Jasmine 框架的 it()
函数,在此过程中,我想知道是否有一个函数作为第二个参数传递给 it()
函数是否属于 async
类型。我尝试使用 instanceof Promise
因为所有 async
函数都会返回一个 Promise,但它永远不会解析为 true,也永远不会进入以下代码块中的 if block 。我尝试将所有函数记录到控制台,发现所有 async()
函数规范的返回类型均为 tslib_1.awaiter(some args..)
。
这是我所拥有的:
let newIt = jasmine.getEnv().it;
jasmine.getEnv().it = function(...args): jasmine.Spec {
// do something.
if(args[1] instanceOf Promise) {
debugger; // never comes in here.
// catch error.
}
return newIt.apply(this, arguments);
}
我在这里做错了什么?谁能指出我正确的方向吗?
谢谢。
编辑:假设我有以下两个虚拟规范,一个是异步的,另一个是同步的:
异步测试:
const exp = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 500);
});
};
it('asyncTest', async () => {
expect(await exp()).toEqual(1);
}, 600);
同步:
it('testNon', () => {
expect(true).toBe(true);
});
最佳答案
这是 XY 问题。正如 this answer 中指出的通常不需要检查它是否是异步函数,因为这并不重要。 async
函数只是一个返回 Promise 的函数。 () => Promise.resolve()
和 async () => {}
都应以相同的方式处理。
事实证明,在转译的 TypeScript 代码中无法区分异步函数和常规函数 - 它们都只是常规函数。
args[1] instanceOf Promise
不正确,因为函数不是 Promise
的实例。
猴子修补通常以这种方式执行(这不是 Jasmine 或本例特有的):
let newIt = jasmine.getEnv().it;
jasmine.getEnv().it = function(...args): jasmine.Spec {
const fn = args[1];
let newFn;
if (fn.length > 0) {
// async spec with done param
newFn = function (done) {
const result = fn.call(this, done);
if(result instanceOf Promise)
// or even better,
// if(result && typeof result.then === 'function')
debugger;
return result;
}
} else {
newFn = function () {
const result = fn.call(this);
if(result instanceOf Promise)
debugger;
return result;
}
}
args[1] = newFn;
return newIt.apply(this, args);;
}
应该检查测试函数结果是否是Promise
的实例(或者检查它是否是thenable)。
关于javascript - 如何以编程方式查找函数是否异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060405/