我有以下验证功能检查用户是否存在:
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):错误:用户不存在
所以我的问题是,我如何重写测试以确保它能够获得承诺拒绝?
答案 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
内调用您的方法(不将其包装到方法中)。
我希望这很清楚:)如果您有任何疑问 - 请随时提出。