未执行块之前的 Mocha 动态测试生成
Mocha Dynamic test generation in before block not getting executed
按照此 post 中的建议,我尝试了创建动态测试的步骤,但我看到实际测试(test.getMochaTest() 在我下面的实现中)没有被执行。我在这里遗漏了什么,对 test.getMochaTest() 的调用没有在之前的块中执行。
describe('Dynamic Tests for Mocha', async () => {
let outcome ;
before(async() => {
await init().catch(() => console.error('Puppeteer environment initialization failed'));
return collectTests().then(async(collectTests) => {
console.info('4.Executing tests :');
describe('Dynamic test execution', async() => {
collectTests.forEach(async(test) => {
console.info(`\tModule under test : ${test.name}`);
// impl. of test.getMochaTest() DOES NOT get executed.
it(test.name, async() => outcome = await test.getMochaTest().catch(async () => {
console.error(`error while executing test:\t${test.name}`);
}));
});
}) ;
});
});
after(async () => {
console.info('5. Exiting tests...');
await HelperUtils.delay(10000).then(async () => { await browser.close(); });
console.log('executing after block');
});
it('placeholder', async() => {
await
console.log('place holder hack - skip it');
});
});
此处返回测试数组:
async function collectTests():Promise<Array<ITest>> {
console.info('3.Collecting tests to execute ...');
testArray = new Array<ITest>();
const login:ITest = new SLogin('Login Check');
testArray.push(login);
return testArray;
}
SLogin -> 中 getMochaTest
的以下实现未执行。
export default class SLogin extends BTest implements ITest {
constructor(name: string) {
super(name);
}
async getMochaTest():Promise<Mocha.Func> {
return async () => {
console.log('Running Login check');
expect(true).to.equal(true);
};
}
}
您似乎并没有真正调用测试。
仅调用 test.getMochaTest()
returns Promise 中的异步测试函数,它不会执行它。因此,您的 catch
块在 获取 函数时捕获错误,而不是在 执行 函数时捕获错误。
将其分成多行有望让事情变得更清楚。
这是您的代码示例的作用。注意它从不执行返回的测试函数:
it(test.name, async () => {
const testFn = await test.getMochaTest().catch(() =>
console.error(`error while ***obtaining*** test: \t${test.name}`));
// oops - testFn never gets called!
});
这里是实际调用测试的更正版本:
it(test.name, async () => {
const testFn = await test.getMochaTest().catch(() =>
console.error(`error while ***obtaining*** test: \t${test.name}`));
const outcome = await testFn().catch(() =>
console.error(`error while ***executing*** test: \t${test.name}`));
});
注意:我用 await
和 catch()
这样写的,以便更好地匹配您的代码示例的格式。但是,值得指出的是它混合了 async
/await
和 Promise
语法。更惯用的是在使用 async
/await
.
时用 try/catch
块捕获错误
按照此 post 中的建议,我尝试了创建动态测试的步骤,但我看到实际测试(test.getMochaTest() 在我下面的实现中)没有被执行。我在这里遗漏了什么,对 test.getMochaTest() 的调用没有在之前的块中执行。
describe('Dynamic Tests for Mocha', async () => {
let outcome ;
before(async() => {
await init().catch(() => console.error('Puppeteer environment initialization failed'));
return collectTests().then(async(collectTests) => {
console.info('4.Executing tests :');
describe('Dynamic test execution', async() => {
collectTests.forEach(async(test) => {
console.info(`\tModule under test : ${test.name}`);
// impl. of test.getMochaTest() DOES NOT get executed.
it(test.name, async() => outcome = await test.getMochaTest().catch(async () => {
console.error(`error while executing test:\t${test.name}`);
}));
});
}) ;
});
});
after(async () => {
console.info('5. Exiting tests...');
await HelperUtils.delay(10000).then(async () => { await browser.close(); });
console.log('executing after block');
});
it('placeholder', async() => {
await
console.log('place holder hack - skip it');
});
});
此处返回测试数组:
async function collectTests():Promise<Array<ITest>> {
console.info('3.Collecting tests to execute ...');
testArray = new Array<ITest>();
const login:ITest = new SLogin('Login Check');
testArray.push(login);
return testArray;
}
SLogin -> 中 getMochaTest
的以下实现未执行。
export default class SLogin extends BTest implements ITest {
constructor(name: string) {
super(name);
}
async getMochaTest():Promise<Mocha.Func> {
return async () => {
console.log('Running Login check');
expect(true).to.equal(true);
};
}
}
您似乎并没有真正调用测试。
仅调用 test.getMochaTest()
returns Promise 中的异步测试函数,它不会执行它。因此,您的 catch
块在 获取 函数时捕获错误,而不是在 执行 函数时捕获错误。
将其分成多行有望让事情变得更清楚。
这是您的代码示例的作用。注意它从不执行返回的测试函数:
it(test.name, async () => {
const testFn = await test.getMochaTest().catch(() =>
console.error(`error while ***obtaining*** test: \t${test.name}`));
// oops - testFn never gets called!
});
这里是实际调用测试的更正版本:
it(test.name, async () => {
const testFn = await test.getMochaTest().catch(() =>
console.error(`error while ***obtaining*** test: \t${test.name}`));
const outcome = await testFn().catch(() =>
console.error(`error while ***executing*** test: \t${test.name}`));
});
注意:我用 await
和 catch()
这样写的,以便更好地匹配您的代码示例的格式。但是,值得指出的是它混合了 async
/await
和 Promise
语法。更惯用的是在使用 async
/await
.
try/catch
块捕获错误