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?
3 réponses
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);
});
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.
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?
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.