即使测试未返回promise,qunit如何知道异步测试回调何时完成?

Qunit一步一步地执行异步测试,但是如何知道测试已经完成,因为测试没有返回qunit可以等待的Promise?

在此演示示例https://jsfiddle.net/6bnLmyof/

function squareAfter1Second(x) {
    const timeout = x * 1000;
    console.log("squareAfter1Second x:",x);
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(x * x);
        },timeout);
    });
}

const { test } = QUnit;

test( "an async test",async t => {
    console.log("starting test1");
    t.equal( await squareAfter1Second(3),9 );
    t.equal( await squareAfter1Second(4),16 );
});

test( "an async test2",async t => {
    console.log("starting test2");
    t.equal( await squareAfter1Second(1),1 );
});

有2个异步测试逐一运行。测试将宏任务(setTimeout)发布到事件循环中,但是尽管测试未返回promise,但qunit仍能够以某种方式等待测试完成。同样,在qunit的源代码中,不存在等待关键字。

L_KJJ 回答:即使测试未返回promise,qunit如何知道异步测试回调何时完成?

异步函数始终返回Promise,该Promise在到达其块的末尾(或到达return)时解决。因此,即使未显式返回任何内容,await也意味着两个异步回调都隐式返回Promises,该Promises将在函数中的所有await完成之后解析。因此,test只需要遍历被调用的每个回调函数,并await进行每次调用。

这是一个示例,您也可以自己实现此目标,而无需更改squareAfter1Secondtest调用中的任何代码:

const queue = []
const test = (_,callback) => {
  queue.push(callback);
};

function squareAfter1Second(x) {
    const timeout = x * 1000;
    console.log("squareAfter1Second x:",x);
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(x * x);
        },timeout);
    });
}

test( "an async test",async t => {
    console.log("starting test1");
    t.equal( await squareAfter1Second(3),9 );
    t.equal( await squareAfter1Second(4),16 );
});

test( "an async test2",async t => {
    console.log("starting test2");
    t.equal( await squareAfter1Second(1),1 );
});

(async () => {
  for (const callback of queue) {
    console.log('Awaiting callback...');
    await callback({ equal: () => void 0 });
    console.log('Callback done');
  }
})();

,

这就是token.paymentData object的重点(异步等待promise结果,并且只有在此之后才继续)

本文链接:https://www.f2er.com/2928595.html

大家都在问