mocha docs state
或者,您可以返回一个,而不是使用done()回调 诺言。如果您正在测试的API返回promise,这将非常有用 而不是采取回调
但是在拒绝方面,这两种方式似乎有不同的结果:
var Promise = require("bluebird");
describe('failure', function () {
describe('why2describes', function () {
it("fails caught", function (done) {
new Promise(function (resolve, reject) {
reject(new Error("boom"))
}).catch(function (err) {
done(err)
})
});
it("fails return", function (done) {
return new Promise(function (resolve, reject) {
reject(new Error("boom"))
})
});
})
});
第一个结果
Error: boom
第二个结果
Unhandled rejection Error: boom
然后另外说明Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
第二种情况我做错了吗?
答案 0 :(得分:3)
第二种情况我做错了吗?
是。两件事。
如果您没有附加到Promise链的catch
处理程序,则链中发生的错误将以拒绝的承诺的形式丢失。 Bluebird通过检测并抛出该错误确保不会发生这种情况
Unhandled rejection Error: boom
在异步情况下,调用done
函数是让测试处理器知道当前测试已完成的方式。在第二种情况下,您永远不会致电done
。因此,它等待默认超时,2000ms,然后使该错误的测试用例失败。
但是如果您想使用Promises /您的API返回Promise,那么您根本不应该使用done
函数。您的代码应如下所示
it("fails return", function () { // no `done` argument here
return new Promise(function (resolve, reject) {
// ideally you would be doing all the assertions here
})
});
在处理基于Promises的测试时要注意的另一个重要事项是,您应该返回promise对象。