javascript - 如何以编程方式查找函数是否异步?

标签 javascript typescript jasmine

我正在尝试覆盖(猴子补丁)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/

相关文章:

angular - Jasmine 测试失败但 'expected' 和 'toBe' 字符串似乎相等?

javascript - 如何以编程方式在 Cognito 用户池中创建用户?

javascript - 如何修复集群捆绑图中的缩放和平移?

typescript - 我可以编写一个抛出异常而不是返回 bool 值的类型保护吗?

angular - 如何在 Angular2 中为日期添加天数?

javascript - JS : replace function definition before object instantiation

javascript - Angularjs limitTo 在 ng-repeat 中不起作用

javascript - 使用 css3 或 javascript 动画 webkit 渐变的方法?

javascript - 如何在给定范围的范围内拆分数字

angularjs - 错误 : Expected a spy, 但得到了函数