测试是否在Nodejs中使用Jasmine解决或拒绝了承诺

时间:2014-11-27 06:31:19

标签: javascript node.js jasmine promise

我知道如何在摩卡中做到这一点,但想知道如何使用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,当然,测试失败了。我在网上找不到任何可以让它工作的例子。

有人可以帮帮我吗?

感谢。

5 个答案:

答案 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方法检查履行价值。相应的拒绝方法是isRejectedreason

答案 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)
})