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

时间:2017-05-29 10:40:17

标签: asynchronous mocha jestjs

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

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

但是,如果异步提取该数组,我无法让测试框架等到获取数组之后再尝试遍历它。

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);
        });
    });
});

这说Cannot read property 'forEach' of undefined失败了。我尝试过使用async/awaitPromise并传入done回调但无效的所有组合。

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

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

2 个答案:

答案 0 :(得分:1)

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

$rootscope

你可以做更多的事情。例如,您可以通过进一步调用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!"); }); }); }); 来创建嵌套作用域。此外,由于tester.test()没有tapbefore等概念(除非您使用Mocha-like DSL),因此您可以简单地使用命令式代码来模拟等效行为

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

答案 1 :(得分:0)

摩卡有 some support async tests。具体来说,您的 it() 回调可以是异步的。以下是如何重新排列您的测试以“循环从异步调用返回的数组”

const chai = require('chai');
const { expect } = require('chai');

function getMyTestData() {
  return new Promise(resolve => setTimeout(() => resolve(['mocha', 'jest']), 1000));
}

describe('Test using various frameworks', () => {
  it('Should test by looping over an array returned from an async call', async () => {
    const myTestData = await getMyTestData();
    for(let datum of myTestData) {
      expect(datum.length).greaterThan(4, `Data '${datum}' not long enough`);
    }
  })
});