Sinon Stub дает неожиданный UnhandledPromiseRejectionWarning - PullRequest
0 голосов
/ 24 мая 2018

У меня есть такая функция:

    static async performDatabaseConnectivityHealthCheck(logger) {

    let con;
    let ret;

    try {

        con = mysql.createConnection({
            host: config.db.host,
            user: config.db.user,
            password: config.db.password,
            database: config.db.db,
        });

        const { retData } = await sqlFileReader.read('./src/database/sql/healthcheck.sql', [config.db.db], con, logger);

        // Do something with retData.....

    }
    catch (error) {
        logger.error(error.message);
        throw error;
    }
    finally {
        if (con) {
            con.end();
        }
    }
    return ret;

}

И такой тест:

    it('throws a \'Database Healthcheck Error\' error when the Database Healthcheck gives the wrong data', async () => {

//Some irrelevant details here including providing rars for rars.logger in the following...

    sandbox.stub(sqlFileReader, 'read').returns(Promise.reject(new Error("ER_PROCACCESS_DENIED_ERROR: execute command denied to user 'dchambers'@'%' for routine 'uk_txtloan.connection_ids'")));

    expect(async () => {
        await RiskAffordabilityReportService.performDatabaseConnectivityHealthCheck(rars.logger);
    }).to.throw('ER_PROCACCESS_DENIED_ERROR: execute command denied to user \'dchambers\'@\'%\' for routine \'uk_txtloan.connection_ids\'');

});

У меня две проблемы.Во-первых, строка sandbox.stub выдает следующее предупреждение, которое меня смущает, поскольку я прошу отклонить Обещание!

UnhandledPromiseRejectionWarning: Error: ER_PROCACCESS_DENIED_ERROR: execute command denied to user 'dchambers'@'%' for routine 'uk_txtloan.connection_ids'

Во-вторых, тест не проходит:

AssertionError: expected [Function] to throw an error.

Меня больше всего интересует предупреждение.Я попробовал следующий синтаксис, и они дают ту же ошибку:

sandbox.stub(sqlFileReader, 'read').throws(new Error("ER_PROCACCESS_DENIED_ERROR: execute command denied to user 'dchambers'@'%' for routine 'uk_txtloan.connection_ids'"));

sandbox.stub(sqlFileReader, 'read').resolves(Promise.reject(new Error("ER_PROCACCESS_DENIED_ERROR: execute command denied to user 'dchambers'@'%' for routine 'uk_txtloan.connection_ids'")));

sandbox.stub(sqlFileReader, 'read').rejects(new Error("ER_PROCACCESS_DENIED_ERROR: execute command denied to user 'dchambers'@'%' for routine 'uk_txtloan.connection_ids'"));

Что такое правильноеспособ устранить предупреждение?Бонус: пройдите тест.

1 Ответ

0 голосов
/ 24 мая 2018

Необработанная ошибка отклонения обещания выдается в последних реализациях Promise, если отклоненное обещание не было обработано, то есть не было приковано catch(...) или then(..., ...).

Chai to.throw завертыванием утвержденияфункция с try..catch, но в функции async нет ошибки.async функция является синтаксическим сахаром для функции, которая возвращает обещание.Неопределенная ошибка внутри функции async приводит к возврату отклоненного обещания.Вместо этого это должно быть подтверждено утверждением «как обещано»:

expect(RiskAffordabilityReportService.performDatabaseConnectivityHealthCheck(rars.logger))
.to.be.rejectedWith(
  Error,
  'ER_PROCACCESS_DENIED_ERROR: execute command denied to user \'dchambers\'@\'%\' for routine \'uk_txtloan.connection_ids\''
);
...