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

标签 javascript es6-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) 发布到事件循环,但不知何故 qunit 能够等待测试完成,尽管测试没有返回 promise。此外,在 qunit 的源代码中没有 await 关键字。

最佳答案

异步函数总是返回一旦到达其 block 末尾(或到达return)就解决的Promises。因此,即使没有显式返回任何内容,await 也意味着两个异步回调都隐式返回在函数中的所有 await 完成后解析的 Promises。所以 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');
  }
})();

关于javascript - 即使测试没有返回 promise,qunit 如何知道异步测试回调何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59318831/

相关文章:

使用 webdriverIO 的 Javascript 循环元素

javascript - 将 asyncTest 与 for 循环一起使用

执行此行时发生 Javascript Sencha cmd 应用程序构建错误

javascript - 根据值拆分数组

javascript - 如何隐藏谷歌图表中的列

javascript - 如何检测用户是否删除了输入框中的文本

javascript - 对象作为 React 子对象无效(找到 : [object Promise]) Google Maps

javascript - 在 for 循环中创建 promise 链

jquery - 使用客户端测试 (qunit) 测试什么

javascript - 有人可以解释在使用 QUnit 进行单元测试时使用 qunit-fixture 吗?