Jest 或 Mocha:基于异步初始化动态创建测试

cur*_*zen 5 asynchronous mocha.js jestjs

我试图通过循环从异步调用返回的数组来动态生成测试。我只是不知道如何做到这一点 - 无论是使用 mocha 还是使用 jest。为了说明使用代码,以下同步示例有效:

describe("Test using various frameworks", () => {
    ["mocha", "jest"].forEach(framework => {
        it(`Should test using ${framework}`, () => {
            expect(true).toBe(true);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,如果该数组是异步获取的,则我无法让测试框架等到数组被获取后再尝试对其进行循环。

async function getFrameworks() {
    //TODO: get it from some async source here
    return ["mocha", "jest"];
}

describe("Test using various frameworks", () => {
    var frameworks;
    //before() instead of beforeAll() if using mocha
    beforeAll(async ()=> {
        frameworks = await getFrameworks();
    });

    frameworks.forEach(framework => {
        it(`Should test using ${framework}`, () => {
            expect(true).toBe(true);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

这不能说Cannot read property 'forEach' of undefined。我已经尝试了所有使用排序的组合async/awaitPromise并传递done回调,但无济于事。

我最接近的是使用 Mocha 的--delay标志,但这只能解决部分问题。在我的实际用例中,我真正想做的是before()orbeforeAll()钩子中运行一些异步初始化,然后我用它来动态生成测试。

关于如何使用 mocha 或 jest 执行此操作的任何指示?

cur*_*zen 0

为了回答我自己的问题,我没有找到使用 Jest 或 Mocha 来做到这一点的方法,但我可以使用tap来完成它- 我通过babel-tap使用它。

import tap from "babel-tap";

async function getFrameworks() {
    //TODO: get it from some async source here
    return ["mocha", "jest"];
}

getFrameworks().then(frameworks => {
    frameworks.forEach(framework => {
        tap.test(`Should test using ${framework}`, (tester) => {
            tester.ok("It works!");
        });
    }); 
});
Run Code Online (Sandbox Code Playgroud)

不过,您还可以做更多事情。tester.test()例如,您可以通过进一步调用来创建嵌套范围。另外,由于tap没有 等概念beforeafter除非您使用类似 Mocha 的 DSL),因此您可以简单地使用命令式代码来模拟等效行为。

此外,您可以async/await在测试中自由使用样式调用。