node.js - Sinon Stub 给出了意外的 UnhandledPromiseRejectionWarning

标签 node.js sinon chai chai-as-promised

我有一个像这样的函数:

    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 行给出了以下警告,我对此感到困惑,因为我要求 Promise 被拒绝!

UnhandledPromiseRejectionWarning:错误:ER_PROCACCESS_DENIED_ERROR:对例程“uk_txtloan.connection_ids”的用户“dchambers”@“%”执行命令被拒绝

其次,测试未通过:

AssertionError:预期 [Function] 抛出错误

我主要想知道这个警告。我尝试了以下语法,但它们给出了相同的错误:

sandbox.stub(sqlFileReader, 'read'). throws(new Error("ER_PROCACCESS_DENIED_ERROR: 对于例程 'uk_txtloan.connection_ids' 执行命令被拒绝给用户 'dchambers'@'%'"));

sandbox.stub(sqlFileReader, 'read').resolves(Promise.reject(new Error("ER_PROCACCESS_DENIED_ERROR: 拒绝用户 'dchambers'@'%' 对于例程 'uk_txtloan.connection_ids' 执行命令") ));

sandbox.stub(sqlFileReader, 'read').rejects(new Error("ER_PROCACCESS_DENIED_ERROR: 拒绝用户 'dchambers'@'%' 对于例程 'uk_txtloan.connection_ids' 执行命令"));

消除警告的正确方法是什么?奖励:通过测试。

最佳答案

如果未处理被拒绝的 Promise,即未与 catch(...) 链接,则在最近的 Promise 实现中会引发未处理的 Promise 拒绝错误>然后(...,...)

Chai to.throw 断言用 try..catch 包装函数,但 async 函数中不会抛出错误。 async 函数是返回 Promise 的函数的语法糖。 async 函数内 Uncaught Error 会导致返回被拒绝的 Promise。相反,应该使用 chai-as-promised 断言来断言:

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\''
);

关于node.js - Sinon Stub 给出了意外的 UnhandledPromiseRejectionWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50514801/

相关文章:

javascript - afterEach 的 Mocha 更改超时

javascript - 需要帮助了解 Node.js 使用 JavaScript API 进行路由吗?

node.js - mocha/sinon stub 恢复不起作用

javascript - 在 sinon 中创建一个假的 object.method() "from scratch"?

javascript - Sinon - 如何使间接调用的函数返回某些内容

javascript - 如何在 JavaScript 单元测试中模拟 localStorage?

javascript - Mocha 和 NightmareJS-继续测试

javascript - 无效传输,必须是具有日志方法的对象 winston mongodb logging

javascript - 我们是否需要 NodeJs 来在服务器上运行 react 应用程序?

mysql - Nodejs 中的嵌套 Cron 作业