【问题标题】:ES6 Promises in MochaMocha 中的 ES6 Promise
【发布时间】:2015-05-02 09:08:03
【问题描述】:

我正在使用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 块进行断言呢?

【问题讨论】:

  • 你检查this了吗?
  • 不应该是console.log(err);done(err);吗?
  • @thefourtheye 承诺断言是我正在寻找的。谢谢,这是一个很好的资源。
  • @mido22 然后问题是对承诺的拒绝做出断言。但是,正如 thefourtheye 上面所说,Mocha 显然内置了这个功能。
  • 如果你断言承诺成功并且你不需要断言任何其他东西,你可以直接返回承诺值而不调用.then().catch()。这能回答你的问题吗?

标签: javascript mocha.js ecmascript-6 chai es6-promise


【解决方案1】:

我在 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's done。

一个问题是如果最后一个然后返回一些东西,那么我需要在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()。

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

【讨论】:

  • 就我个人而言,我不会从测试用例中的任何 onFullFilled 处理程序返回任何内容。但是为了避免返回值,.then(done.bind(null, null), done) 对我来说似乎更简洁。
【解决方案2】:

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

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

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

【讨论】:

  • 嗨,是否可以按照承诺使用 chai 为上述问题提供粘贴代码?
【解决方案3】:

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

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

【讨论】:

  • 我如何才能对 Promise 的拒绝做出断言?
  • 这是什么意思?承诺应该成功还是失败?如果它应该成功,我不明白你为什么需要断言任何关于拒绝的事情,只要你确保它不会发生。
  • 因为您想对拒绝承诺的条件做出断言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2017-06-05
  • 2018-07-04
  • 2016-05-22
  • 2015-12-24
  • 2017-04-08
相关资源
最近更新 更多