J'ai une méthode sur mon serveur node.js , qui renvoie une promesse - lève une exception personnalisée (UserNotAuthenticatedError) - et je veux écrire un test pour m'assurer que cette exception est levée quand il le faut.

La méthode est la suivante:

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

J'ai essayé d'écrire le test, et c'est ce que j'ai jusqu'à présent:

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

J'ai réussi à vérifier que la promesse retournée a été rejetée, mais je veux également être plus précis et vérifier que la promesse retournée est un UserNotAuthenticatedError. Comment pourrais-je faire ça?

4
charliebrownie 9 mars 2016 à 17:00

3 réponses

Meilleure réponse

J'ai finalement trouvé un moyen beaucoup plus agréable de le résoudre:

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);
});
3
charliebrownie 9 mars 2016 à 19:20

Je suppose qu'il existe de meilleures façons de gérer cela que celle que je propose. Celui-ci devrait néanmoins fonctionner.

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

Où fait est la fonction qui pourrait être passée en paramètre à la méthode it. Il spécifie qu'il s'agit d'un test asynchrone.

1
Jakub Balhar 9 mars 2016 à 14:10

Ne voudriez-vous pas simplement utiliser un promise.catch(function(error){}) et inspecter la variable error pour vous assurer que c'est le bon type d'erreur?

1
TKoL 9 mars 2016 à 14:06