web-dev-qa-db-ja.com

NodejsのJasmineを使用して、約束が解決または拒否されるかどうかをテストする

私はモカでそれを行う方法を知っていますが、ジャスミンでそれを行う方法を知りたいです。私はこれを試しました

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

ただし、状態は常にpendingであり、もちろんテストは失敗します。私はそれを動作させることができるオンラインの例を見つけることができませんでした。

誰かがこれを手伝ってくれますか?

ありがとう。

26
chepukha

ジャスミンで非同期コードをテストするには、 その非同期構文 を使用する必要があります、例:

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

finallyブロックを使用して、Promiseの状態をテストできます。

it('should resolve if auth succeed', (done)=>{
    var p = server.login('user', 'password');
    p.finally(()=>{
        expect(p.isFulfilled()).toBeTruthy();
        done();
    });
});

isFulfilledを使用してプロミスが履行されたかどうかを確認し、valueメソッドを使用して履行値を確認できます。拒否の対応するメソッドは、isRejectedおよびreasonです。

5
SET

ジャスミン2.7以降は、約束の返却をサポートしており、その完全な状態がテストされます。

拒否をテストするには:

_it('test promise with jasmine', async () => {
    try {
        await getRejectedPromise();
    } catch (err) {
        return;
    }

    throw new Error('Promise should not be resolved');
});
_

またはまだ:

_it('test promise with jasmine', async () => {
    await getRejectedPromise()
        .then(
            () => Promise.reject(new Error('Promise should not be resolved')), 
            () => {});
});
_

実際のメッセージを確認するには、通常のinstanceof/toBe()に加えて、catch内に配置します。

_expect(() => { throw err }).toThrow(new MyCustomError('Custom error message'));
_

このアプローチの利点は、テスト出力でより良い失敗メッセージを表示できることです。

MyCustomError:カスタムエラーメッセージをスローする関数が必要ですが、別のエラーメッセージがスローされました。

通常の出力よりもやや良い。

解決されたかどうかをテストするために(より簡単にすることはできません):

_it('test promise with jasmine', async () => {
    await getRejectedPromise();
});
_
5
André Werlang

expectAsync()を使用できるようになりました

期待される成功:

it('expect result', async () => {
   ...
   await expectAsync(someAsyncFunction(goodInput)).toBeResolved(expectedResponse)
})

失敗の予想:

it('expect result', async () => {
   ...
   await expectAsync(someAsyncFunction(badInput)).toBeRejectedWith(expectedResponse)
})
1
nxmohamad

@Leonidの答えは正しいですが、そのように単純化して、約束だけを使用することができます。

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);
       }
    })
})
0
Alexander Mills