Tester si une promesse est résolue ou rejetée avec Jasmine dans Nodejs
Je sais comment le faire en Moka mais je veux savoir comment le faire avec Jasmine. J'ai essayé ceci
describe('test promise with jasmine', function() {
it('expects a rejected promise', function() {
var promise = getRejectedPromise();
// return expect(promise).toBe('rejected');
return expect(promise.inspect().state).toBe('rejected');
});
});
Cependant, l'état est toujours pending
et, bien sûr, le test échoue. Je n'ai trouvé aucun exemple en ligne que je pourrais le faire fonctionner.
Quelqu'un peut-il m'aider?
Merci.
4 réponses
Pour tester le code asynchrone avec jasmine, vous devez utiliser sa syntaxe asynchrone , par exemple:
describe('test promise with jasmine', function(done) {
var promise = getRejectedPromise();
promise.then(function() {
// Promise is resolved
done(new Error('Promise should not be resolved'));
}, function(reason) {
// Promise is rejected
// You could check rejection reason if you want to
done(); // Success
});
});
Vous pouvez utiliser le bloc finally
pour tester l'état de promesse:
it('should resolve if auth succeed', (done)=>{
var p = server.login('user', 'password');
p.finally(()=>{
expect(p.isFulfilled()).toBeTruthy();
done();
});
});
Vous pouvez utiliser isFulfilled
pour vérifier si la promesse a été remplie et la méthode value
pour vérifier la valeur d'exécution. Méthodes correspondantes de rejet sont isRejected
et reason
.
Jasmine 2.7 en avant soutient les promesses de retour, et aurait son état REMPLI testé.
Pour tester rejet:
it('test promise with jasmine', async () => {
try {
await getRejectedPromise();
} catch (err) {
return;
}
throw new Error('Promise should not be resolved');
});
Ou encore:
it('test promise with jasmine', async () => {
await getRejectedPromise()
.then(
() => Promise.reject(new Error('Promise should not be resolved')),
() => {});
});
Pour vérifier le message réel , outre le instanceof/toBe()
habituel, placez à l'intérieur du catch
:
expect(() => { throw err }).toThrow(new MyCustomError('Custom error message'));
L'avantage de cette approche est d'avoir un message d'échec plus agréable sur la sortie de test.
Fonction attendue pour lancer MyCustomError: message D'erreur personnalisé, mais il a jeté une autre erreur message.
Un peu mieux que la sortie habituelle.
Pour tester résolu (ne peut pas être plus simple):
it('test promise with jasmine', async () => {
await getRejectedPromise();
});
La réponse de@Leonid est correcte, mais vous pouvez simplifier comme ça, et n'utiliser que des promesses:
it('test promise with jasmine', function() {
return getRejectedPromise().then(function() {
// Promise should not be resolved, so we reject it
return Promise.reject(new Error('Promise should not be resolved'));
})
.catch(function(err){
if(!/Promise should not be resolved/.test(err && err.message)){
return Promise.reject(err);
}
})
})