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.

25
demandé sur chepukha 2014-11-27 09:31:19

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
    });
});
32
répondu Leonid Beschastny 2015-04-15 20:05:39

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.

4
répondu SET 2018-06-27 05:57:41

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();
});
3
répondu André Werlang 2017-12-07 20:43:40

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);
       }
    })
})
1
répondu Alexander Mills 2017-12-07 20:15:54