Je sais comment le faire à Mocha mais je veux savoir comment le faire avec Jasmine. J'ai essayé
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 faire fonctionner.
Quelqu'un pourrait m'aider avec ça?
Merci.
Pour tester du code asynchrone avec du jasmin, 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 la 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é tenue et la méthode value
pour vérifier la valeur de réalisation. Les méthodes de rejet correspondantes sont isRejected
et reason
.
jasmine 2.7 prend en charge les promesses de retour et verrait son état rempli testé.
Pour tester le 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, en plus de la fonction instanceof/toBe()
habituelle, 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 lancé un autre message d'erreur.
Un peu mieux que la sortie habituelle.
Pour tester pour résolu (ne peut pas être plus simple):
it('test promise with jasmine', async () => {
await getRejectedPromise();
});
vous pouvez maintenant utiliser expectAsync()
Attendre le succès:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(goodInput)).toBeResolved(expectedResponse)
})
Attente d'un échec:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(badInput)).toBeRejectedWith(expectedResponse)
})
@ La réponse de Leonid est correcte, mais vous pouvez simplifier ainsi 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);
}
})
})