Генерация динамического теста Mocha в перед блоком не выполняется

Как было предложено в этом посте , я попробовал следующее, но вижу, что на самом деле тест не выполняется. Что мне здесь не хватает, вызов test.getMochaTest() не выполняется в блоке before.

      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<IBizxTest>> {
    console.info('3.Collecting tests to execute ...');
    testArray = new Array<IBizxTest>();
    const instanceEntry:IBizxTest = new SfInstance('Instance Check');
    const login:IBizxTest = new SfLogin('Login Check');
    const dcCheck:IBizxTest = new SfDataCenter('DataCenter check', navMenu);

    testArray.push(dcCheck);
    testArray.push(instanceEntry);
    testArray.push(login);
    // testArray.push(dataCenter, login, instanceEntry);
    return testArray;
}

Нижеприведенная реализация getMochaTest в SLogin -> не выполняется.

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

1 ответ

Решение

Не похоже, что вы действительно запускаете тест.

Вызов test.getMochaTest()возвращает только функцию асинхронного теста в обещании, но не выполняет ее. Так что ваши 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}`));
});

Примечание: я написал это таким образом с помощью и catch()чтобы лучше соответствовать формату вашего образца кода. Однако стоит отметить, что он смешивает / и Promiseсинтаксис. Более идиоматичным было бы отлавливать ошибки с помощью try/catch блокировать при использовании async/ await.

Другие вопросы по тегам