Проверьте, разрешено ли обещание или отклонено с Жасмином в Нодедже
Я знаю, как это сделать в Mocha, но хочу знать, как это сделать с 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
, и, конечно, тест терпит неудачу. Я не мог найти ни одного примера в Интернете, чтобы я мог заставить его работать.
Может кто-нибудь, пожалуйста, помогите мне с этим?
Спасибо.
Ответы
Ответ 1
Чтобы проверить асинхронный код с жасмином, вы должны использовать его асинхронный синтаксис, например:
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
});
});
Ответ 2
Вы можете использовать блок finnaly
для проверки состояния обещания:
it('should resolve if auth succeed', (done)=>{
var p = server.login('user', 'password');
p.finally(()=>{
expect(p.isFulfilled()).toBeTruthy();
done();
});
});
Вы можете использовать isFulfilled
для проверки выполнения обещаний и метода value
для проверки значения выполнения. Соответствующими методами отклонения являются isRejected
и reason
.
Ответ 3
Ответ @Leonid верен, но вы можете упростить это так и использовать только promises:
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);
}
})
})
Ответ 4
Жасмин 2.7 поддерживает возврату promises и будет проверено его состояние.
Чтобы проверить отклонение:
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();
});