使用promise时mocha js断言挂起?

时间:2016-04-14 09:33:55

标签: javascript node.js mocha bdd assert

"use strict";
let assert = require("assert");

describe("Promise test", function() {
  it('should pass', function(done) {
    var a = {};
    var b = {};
    a.key = 124;
    b.key = 567;
    let p = new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve();
        }, 100)
    });

    p.then(function success() {

        console.log("success---->", a, b);
        assert.deepEqual(a, b, "response doesnot match");
        done();
    }, function error() {

        console.log("error---->", a, b);
        assert.deepEqual(a, b, "response doesnot match");
        done();
    });
 });
});

输出: output result

我使用的是节点v5.6.0。 当值不匹配时,测试似乎挂起断言。

我尝试使用setTimeout检查assert.deepEqual是否存在问题,但它运行正常。

但是在使用Promise时失败并在值不匹配时挂起。

2 个答案:

答案 0 :(得分:4)

您收到该错误,因为您的测试永远不会完成。这个断言:assert.deepEqual(a, b, "response doesnot match");会抛出一个错误,因此当你没有捕获阻塞时,永远不会调用done回调。

您应该在承诺链的末尾添加catch块:

...
p.then(function success() {
    console.log("success---->", a, b);
    assert.deepEqual(a, b, "response doesnot match");
    done();
}, function error() {
    console.log("error---->", a, b);
    assert.deepEqual(a, b, "response doesnot match");
    done();
})
.catch(done); // <= it will be called if some of the asserts are failed

答案 1 :(得分:3)

由于你使用的是Promise,我建议你只需在done的末尾返回它。一旦承诺得到解决(履行或拒绝),摩卡将考虑完成测试,并将消耗承诺。如果被拒绝的Promise,它将使用其值作为抛出的错误。

注意:如果您要返回Promise,请不要声明{{1}}参数。