【问题标题】:Jasmine: Test that returned promise is a concrete exceptionJasmine:测试返回的承诺是一个具体的例外
【发布时间】:2016-03-10 03:20:23
【问题描述】:

我的 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。我怎么能这样做?

【问题讨论】:

    标签: javascript node.js unit-testing jasmine promise


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我想有比我建议的更好的方法来处理这个问题。不过,这个应该可以工作。

        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 方法的函数。它指定它是异步测试。

        【讨论】:

        • 您是否有理由使用.then 的第二个参数而不是更惯用的.catch
        猜你喜欢
        • 2017-04-07
        • 2014-10-31
        • 2020-07-30
        • 2016-06-17
        • 2014-05-19
        • 2015-11-27
        • 1970-01-01
        • 2015-06-05
        • 2016-09-18
        相关资源
        最近更新 更多