我试图通过循环异步调用返回的数组来动态生成测试。我只是无法弄清楚如何做到这一点 - 使用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/await
和Promise
并传入done
回调但无效的所有组合。
我最接近的是使用Mocha的--delay标志,但这只能解决部分问题。在我的实际用例中,我真正想做的是在before()
或beforeAll()
挂钩中运行一些异步初始化,然后我将其用于动态生成测试。
有关如何使用mocha或jest执行此操作的任何指示?
答案 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()
没有tap
,before
等概念(除非您使用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`);
}
})
});