在Mocha中,返回将被拒绝的承诺与调用done(err)具有相同的效果

时间:2016-03-19 16:13:28

标签: javascript promise mocha

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.

第二种情况我做错了吗?

1 个答案:

答案 0 :(得分:3)

  

第二种情况我做错了吗?

是。两件事。

  1. 如果您没有附加到Promise链的catch处理程序,则链中发生的错误将以拒绝的承诺的形式丢失。 Bluebird通过检测并抛出该错误确保不会发生这种情况

    Unhandled rejection Error: boom
    
  2. 在异步情况下,调用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对象。