我正在使用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);
});
});
当我运行此测试时,由于超时而失败。在块中引发的断言失败在catch块中被捕获。我怎么能避免这种情况,直接把它扔到摩卡?
我可以从catch函数中抛出它,但是如何为catch块创建断言?
答案 0 :(得分:4)
如果您的Promise出现故障,它只会调用您的catch回调。结果,Mocha的完成回调从未被调用,并且Mocha从未发现Promise失败了(所以它等待并最终超时)。
您应该将console.log(err);
替换为done(err);
。将错误传递给完成回调时,Mocha应自动显示错误消息。
答案 1 :(得分:3)
我最后使用Chai as Promised解决了我的问题。
它允许你对承诺的解决和拒绝做出断言:
return promise.should.become(value)
return promise.should.be.rejected
答案 2 :(得分:2)
我在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。
一个问题是,如果最后一个返回一些东西,那么我需要在then
和catch
之前使用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()。
很想听到对这种模式的批评。