使用 Chai 处理 promise 拒绝
Handle promise rejection with 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) show throw if user is undefined
(node:18587) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: User does not exist
所以我的问题是,我如何重写测试以使其确实捕获承诺拒绝?
我不完全确定是 mocha 引发了未处理的拒绝。
我认为是您的 bcrypt.compare 本质上是异步的并使用回调。 await
异步函数不能真正开箱即用。
但您可以像这样使用节点 util
库来承诺异步调用:
const util = require('util');
const bcrypt = require('bcrypt');
const bcryptCompare = util.promisify(bcrypt.compare);
现在您可以按预期使用 await bcryptCompare(password, user.password);
。请注意,我在 await 调用后更改了常量。
还要处理 async/await
的拒绝,您应该像这样使用 try/catch
:
let matches;
try {
matches = await bcryptCompare(password, user.password);
} catch(bcryptError) {
throw new Error(bcryptError);
}
要测试 promise-based 函数(异步),请使用 chai-as-promised 插件:
expect(validate.user(undefined, 'pass')).to.be.rejectedWith(Error, 'User does not exist');
在这种情况下,您不要将 () => validate.user()
放入 expect
,因为它不会 return 一个承诺。 async
函数总是 return 一个承诺 ,所以只要在 expect
中调用你的方法就足够了(不用将它包装到一个方法中)。
我希望这很清楚 :) 如果您有任何问题 - 请随时提问。
我有以下验证函数检查用户是否存在:
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) show throw if user is undefined (node:18587) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: User does not exist
所以我的问题是,我如何重写测试以使其确实捕获承诺拒绝?
我不完全确定是 mocha 引发了未处理的拒绝。
我认为是您的 bcrypt.compare 本质上是异步的并使用回调。 await
异步函数不能真正开箱即用。
但您可以像这样使用节点 util
库来承诺异步调用:
const util = require('util');
const bcrypt = require('bcrypt');
const bcryptCompare = util.promisify(bcrypt.compare);
现在您可以按预期使用 await bcryptCompare(password, user.password);
。请注意,我在 await 调用后更改了常量。
还要处理 async/await
的拒绝,您应该像这样使用 try/catch
:
let matches;
try {
matches = await bcryptCompare(password, user.password);
} catch(bcryptError) {
throw new Error(bcryptError);
}
要测试 promise-based 函数(异步),请使用 chai-as-promised 插件:
expect(validate.user(undefined, 'pass')).to.be.rejectedWith(Error, 'User does not exist');
在这种情况下,您不要将 () => validate.user()
放入 expect
,因为它不会 return 一个承诺。 async
函数总是 return 一个承诺 ,所以只要在 expect
中调用你的方法就足够了(不用将它包装到一个方法中)。
我希望这很清楚 :) 如果您有任何问题 - 请随时提问。