"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();
});
});
});
我使用的是节点v5.6.0。 当值不匹配时,测试似乎挂起断言。
我尝试使用setTimeout检查assert.deepEqual是否存在问题,但它运行正常。
但是在使用Promise时失败并在值不匹配时挂起。
答案 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}}参数。