未执行块之前的 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}`));
});

注意:我用 awaitcatch() 这样写的,以便更好地匹配您的代码示例的格式。但是,值得指出的是它混合了 async/awaitPromise 语法。更惯用的是在使用 async/await.

时用 try/catch 块捕获错误