处理承诺拒绝与柴

时间:2018-03-17 10:48:22

标签: javascript mocha chai

我有以下验证功能检查用户是否存在:

validate.user = async (user, password) => {
    const matches = await bcrypt.compare(password, user.password);
    if (matches) return user;
    if (!matches) {
        return validate.logAndThrow('User password does not match');
    }
    return validate.logAndThrow('Error in bcrypt compare');
};

以下使用Chai的测试应该测试一下:

chai.use(sinonChai);
const { expect } = chai;

    describe('#user', () => {
        it('show throw if user is undefined', () => {
            expect(() => validate.user(undefined, 'pass')).to.throw('User does not exist');
        });

错误确实会被抛出,但是mocha在控制台中显示以下内容:

  

2)如果用户未定义则显示throw   (node:18587)UnhandledPromiseRejectionWarning:未处理的promise promise(拒绝ID:2):错误:用户不存在

所以我的问题是,我如何重写测试以确保它能够获得承诺拒绝?

2 个答案:

答案 0 :(得分:1)

我不完全确定摩卡是否会引发未经处理的拒绝。

我认为这是你的bcrypt.compare本质上是异步并使用回调。 await无法在开箱即用的情况下使用异步功能。

但您可以使用节点util库来实现异步调用:

const util = require('util');
const bcrypt = require('bcrypt');

const bcryptCompare = util.promisify(bcrypt.compare);

现在您可以像预期的那样使用await bcryptCompare(password, user.password);。请注意,我在等待电话后更改了常量。

同样要处理async/await的拒绝,您应该使用try/catch,如下所示:

let matches;
try {
    matches = await bcryptCompare(password, user.password);
} catch(bcryptError) {
    throw new Error(bcryptError);
}

答案 1 :(得分:1)

要测试基于承诺的函数(异步),请使用chai-as-promised插件:

expect(validate.user(undefined, 'pass')).to.be.rejectedWith(Error, 'User does not exist');

在这种情况下,您不会将() => validate.user()放入expect,因为它不会返回承诺。 async函数总是返回一个承诺,因此只需在expect内调用您的方法(不将其包装到方法中)。

我希望这很清楚:)如果您有任何疑问 - 请随时提出。