摩卡中的 ES6 承诺

ES6 Promises in Mocha

我正在使用 this polyfill for ES6 promises 和 Mocha / Chai。

我对承诺的断言无效。以下为样例测试:

it('should fail', function(done) {
    new Promise(function(resolve, reject) {
        resolve(false);
    }).then(function(result) {
        assert.equal(result, true);
        done();
    }).catch(function(err) {
        console.log(err);
    });
});

当我 运行 此测试由于超时而失败。在 then 块中抛出的断言失败在 catch 块中被捕获。我怎样才能避免这种情况,直接把它扔给摩卡呢?

我可以直接从 catch 函数中抛出它,但是我该如何为 catch 块做出断言?

如果您的 Promise 失败,它只会调用您的 catch 回调。结果,Mocha 的 done 回调永远不会被调用,并且 Mocha 永远不会发现 Promise 失败(所以它等待并最终超时)。

您应该将 console.log(err); 替换为 done(err);。当您将错误传递给 done 回调时,Mocha 应该会自动显示错误消息。

我最终使用 Chai as Promised 解决了我的问题。

它允许您对承诺的解决和拒绝做出断言:

  • return promise.should.become(value)
  • return promise.should.be.rejected

我在 Mocha/Chai/es6-promise 测试中使用的模式如下:

it('should do something', function () {

    aPromiseReturningMethod(arg1, arg2)
    .then(function (response) {
        expect(response.someField).to.equal("Some value")
    })
    .then(function () {
        return anotherPromiseReturningMethod(arg1, arg2)
    })
    .then(function (response) {
        expect(response.something).to.equal("something")
    })
    .then(done).catch(done)

})

最后一行看起来很奇怪,但在成功或错误时调用 Mocha 的 done。

一个问题是如果最后一个 returns 东西,我需要在 thencatch 之前 noop()*:

it('should do something', function () {

    aPromiseReturningMethod(arg1, arg2)
    .then(function (response) {
        expect(response.someField).to.equal("Some value")
    })
    .then(function () {
        return anotherPromiseReturningMethod(arg1, arg2)
    })
    .then(_.noop).then(done).catch(done)

})

*Lodash 的 noop()。

希望听到对这种模式的任何批评。