我有以下承诺。我知道它们工作正常,因为 funcThree 中的控制台.log输出返回正确的数据。如何通过测试证明这一点?
基本上,我如何测试这个承诺?我尝试在下面进行测试,但无论我在那里放什么(包括期望(false).to.be.true),它总是返回 true。我不相信它实际上达到了预期的声明。
法典
let number = 0;
let count = 0;
// Find Mongoose document
function funcOne(query) {
return new Promise(function (resolve, reject) {
MongooseDocument.find(query)
.exec(function (err, results) {
if (err) {
reject(err);
}
resolve(results);
});
});
}
// Iterate over each document and adjust external value
function funcTwo(documents) {
return new Promise(function (resolve, reject) {
_.each(documents, function (document) {
count += 1;
number += document.otherNumber;
});
if (count >= documents.length) {
resolve({
count,
number,
});
}
});
}
// Chain promises and return result
function funcThree(query) {
return funcOne(query).then(funcTwo).then(function (result) {
console.log("==================");
console.log(result);
return result;
});
}
测试示例
// The expect test below never runs! How do I test this promise? Or
// better yet, how do I get the value returned as a result from the
// promise to test that?
it('should return an object', function () {
funcThree(query).then(function(result) {
return expect(result).to.be.an('object');
});
});
chai
和 chai-as-promised
时,需要指示 chai 实际使用 chai-as-promised
。
var chai = require('chai');
chai.use(require('chai-as-promised');
此外,要将断言转换为返回承诺,您需要使用关键字 eventually
并且您需要将承诺返回给it()
。使用 chai-as-promised
时,您需要针对实际的承诺返回函数执行断言,在本例中为 funcThree(query)
。这就是为什么你总是让你的测试函数返回 true,你实际上并没有等待 Promise 解决,并且由于没有错误发回你的it()
所以它被认为是成功的。所以你上面的测试示例应该如下:
it('should return an object', function () {
return expect(funcThree(query)).to.eventually.be.a('object');
});
您还可以使用以下语法对同一承诺进行多个断言
it('should return an object', function () {
var funcThreePromise = funcThree(query);
// Promise below is whatever A+ Promise library you're using (i.e. bluebird)
return Promise.all([
expect(funcThreePromise).to.eventually.be.fulfilled,
expect(funcThreePromise).to.eventually.be.a('object')
]);
});