我的 node.js 服务器中有一个方法,它返回一个Promise - 抛出一个自定义异常(UserNotAuthenticatedError
) - 我想写一个测试来确保这个必要时抛出异常。
方法如下:
export function changePassword(userId, oldPass, newPass) {
var query = User.findById(userId);
return query.exec()
.then(user => {
if (user.authenticate(oldPass)) {
user.password = newPass;
return user.save();
} else {
// I want to test that this Exception is thrown
throw new UserNotAuthenticatedError();
}
});
}
我已经尝试过写测试了,这就是我到目前为止所做的:
describe('#changePassword', function() {
it('should throw a UserNotAuthenticatedError when passing wrong password', function() {
var userId = user._id;
var wrongPwd = 'wrongpassword';
var newPwd = 'new password';
// so far the following only tells me that the Promise was rejected, but
// I WANT TO TEST THAT THE REJECTION WAS DUE TO A 'UserNotAuthenticatedError'
UserService.changePassword(userId, wrongPwd, newPwd).should.be.rejected;
});
});
我已经完成了检查返回的承诺被拒绝,但我也希望更具体,并检查返回的承诺是UserNotAuthenticatedError
。我怎么能这样做?
答案 0 :(得分:3)
我终于找到了一个更好的解决方法:
it('should throw a UserNotAuthenticatedError when passing wrong password', function() {
var userId = user._id;
var wrongPwd = 'wrongpassword';
var newPwd = 'new password';
var promise = UserService.changePassword(userId, wrongPwd, newPwd);
return promise.should.be.rejectedWith(UserNotAuthenticatedError);
});
答案 1 :(得分:1)
您是否只是使用promise.catch(function(error){})
并检查error
变量以确保它是正确的错误类型?
答案 2 :(得分:1)
我认为有更好的方法来解决这个问题,而不是我建议的方法。不过应该这样做。
var promise = UserService.changePassword(userId, wrongPwd, newPwd);
var error = null;
promise.should.be.rejected;
promise.then(function(){}, function(err){
expect(err).toEqual(jasmine.any(UserNotAuthenticatedError));
done();
});
完成的是可以作为参数传递给it方法的函数。它指定它是异步测试。