Javascript 茉莉花:测试返回的承诺是一个具体的例外

Javascript 茉莉花:测试返回的承诺是一个具体的例外,javascript,node.js,unit-testing,jasmine,promise,Javascript,Node.js,Unit Testing,Jasmine,Promise,我在我的node.js服务器中有一个方法,它返回一个承诺-抛出一个自定义异常(UserNotAuthenticatedError)-我想编写一个测试来确保这个异常在必要时被抛出 方法如下: export function changePassword(userId, oldPass, newPass) { var query = User.findById(userId); return query.exec() .then(user => { if (user

我在我的node.js服务器中有一个方法,它返回一个承诺-抛出一个自定义异常(
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
。我该怎么做呢?

你难道不使用
promise.catch(function(error){})
并检查
error
变量以确保它是正确的错误类型吗?

我想有比我建议的更好的方法来处理这个问题。尽管如此,这一条还是应该有效的

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();
});

其中done是可以作为参数传递给it方法的函数。它指定它是异步测试

我终于找到了一个更好的解决方法:

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);
});

您使用第二个参数来
.then
而不是更惯用的
.catch
有什么原因吗?