我知道如何在摩卡中做到这一点,但想知道如何使用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
,当然,测试失败了。我在网上找不到任何可以让它工作的例子。
有人可以帮帮我吗?
感谢。
答案 0 :(得分:37)
要使用jasmine测试异步代码,您应该使用its async syntax,例如:
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
});
});
答案 1 :(得分:5)
您可以使用finally
块来测试承诺状态:
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 :(得分:5)
jasmine 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();
});
答案 3 :(得分:1)
@ 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);
}
})
})
答案 4 :(得分:1)
您现在可以使用expectAsync()
期望成功:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(goodInput)).toBeResolved(expectedResponse)
})
预期失败:
it('expect result', async () => {
...
await expectAsync(someAsyncFunction(badInput)).toBeRejectedWith(expectedResponse)
})