在 Mocha 中,返回将被拒绝的承诺与调用 done(err) 的效果不同
In Mocha, returning a promise that will be rejected doesn't have the same effect as calling done(err)
摩卡文档状态
或者,您可以返回一个 承诺。如果您正在测试的 API 返回承诺,这将非常有用 而不是接受回调
但在拒绝时,这两种方式似乎有不同的结果:
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.
我在第二种情况下做错了什么吗?
我在第二种情况下做错了什么吗?
是的。两件事。
-
当您没有将
catch
处理程序附加到 Promise 链时,错误发生在链中,将以拒绝 promise 的形式丢失。蓝鸟通过检测并抛出该错误来确保不会发生类似的事情Unhandled rejection Error: boom
-
在异步情况下,调用
done
函数是让测试处理器知道当前测试已完成的方法。在第二种情况下,您从不调用done
。因此,它等待默认超时 2000 毫秒,然后测试用例失败并出现该错误。但是,如果你喜欢使用承诺/你的API返回一个承诺,那么你根本不应该使用
done
函数。您的代码应如下所示it("fails return", function () { // no `done` argument here return new Promise(function (resolve, reject) { // ideally you would be doing all the assertions here }) });
处理基于 Promise 的测试时要注意的另一件重要事情是,您应该返回 promise 对象。
相关文章:
- 蓝鸟的done()和spread()之间的区别
- $.ajax().done()中的window.open和弹出窗口拦截器
- JQuery$.ajax-done()未被调用
- 在jquery文件上传中调用默认的done函数
- 安装节点6后出错,npm ERR!无效版本:1.0.5beta
- system.err风格的控制台以javascript打印
- AngularJS:使用ng-show/hide动态维护下拉列表的3种状态(InProgress、Success、Err
- npm ERR!安装无法't在mac上读取依赖项
- jQuery-更新jQuery.ajax().done()中点击的图像
- 如何使用jasmine测试done和failedDeferredObject
- 使用 jquery.when 和 done 将值从一个 ajax 调用传递到另一个
- 如何确保在 Mocha 中的 done() 之前执行对数据库的循环保存
- Mocha 的 beforeEach() 和 done() 函数不起作用
- Deftjs承诺done()不起作用
- jQuery done() 向下三级
- jQuery.done函数未在IE中启动
- Ajax.done()没有数据
- 使用ajax调用.done发送变量
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- 在 Mocha 中,返回将被拒绝的承诺与调用 done(err) 的效果不同