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