私はモカでそれを行う方法を知っていますが、ジャスミンでそれを行う方法を知りたいです。私はこれを試しました
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
であり、もちろんテストは失敗します。私はそれを動作させることができるオンラインの例を見つけることができませんでした。
誰かがこれを手伝ってくれますか?
ありがとう。
ジャスミンで非同期コードをテストするには、 その非同期構文 を使用する必要があります、例:
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
});
});
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
です。
ジャスミン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();
});
_
expectAsync()
を使用できるようになりました
期待される成功:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(goodInput)).toBeResolved(expectedResponse)
})
失敗の予想:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(badInput)).toBeRejectedWith(expectedResponse)
})
@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);
}
})
})