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

Asynchronous Jest或Mocha:基于异步初始化动态创建测试,asynchronous,mocha.js,jestjs,Asynchronous,Mocha.js,Jestjs,我试图通过在异步调用返回的数组上循环来动态生成测试。我就是不知道该怎么做——要么用摩卡咖啡,要么开玩笑。为了说明如何使用代码,以下同步示例起作用: describe("Test using various frameworks", () => { ["mocha", "jest"].forEach(framework => { it(`Should test using ${framework}`, () => { expect(

我试图通过在异步调用返回的数组上循环来动态生成测试。我就是不知道该怎么做——要么用摩卡咖啡,要么开玩笑。为了说明如何使用代码,以下同步示例起作用:

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);
        });
    });
});
这无法说明
无法读取未定义的属性“forEach”
。我尝试过使用
async/await
Promise
以及传递
done
回调的各种组合,但都没有效果

我最接近的方法是使用摩卡旗,但这只能解决部分问题。在我的实际用例中,我真正想做的是
before()
beforeAll()钩子中运行一些异步初始化,然后使用这些钩子动态生成测试。


关于如何用摩卡咖啡或摩卡咖啡来做这件事,有什么建议吗?

为了回答我自己的问题,我没有找到用摩卡咖啡或摩卡咖啡来做这件事的方法,但我可以用它来完成这件事——我用了它

不过你可以做得更多。例如,您可以通过进一步调用
tester.test()
来创建嵌套作用域。此外,由于
tap
没有
之前
之后等概念(除非使用),因此可以简单地使用命令式代码来模拟等效行为

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

Mocha已经有了。具体来说,您的
it()
回调可以是异步的。下面是如何将测试重新安排为“在异步调用返回的数组上循环”:

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!");
        });
    }); 
});
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`);
    }
  })
});