0

我有以下承诺。我知道它们工作正常,因为 funcThree 中的 console.log 输出返回了正确的数据。我如何通过测试证明这一点?

基本上,我如何测试这个承诺?我已经尝试在下面进行测试,但无论我在那里放什么(包括expect(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');
  });
});
4

1 回答 1

1

使用chaichai-as-promised需要指导 chai 实际使用chai-as-promised

var chai = require('chai');
chai.use(require('chai-as-promised');

此外,要将断言转换为返回一个 Promise,您需要使用关键字eventually,并且您需要将 Promise 返回到it(). 使用时,chai-as-promised您需要对实际的 Promise 返回函数执行断言,在这种情况下,funcThree(query). 这就是为什么你总是让你的测试函数返回 true,你实际上并没有等待 Promise 解决,并且因为没有错误发送回你it(),所以它被认为是成功的。所以你上面的测试例子应该如下:

it('should return an object', function () {
  return expect(funcThree(query)).to.eventually.be.a('object');
});

您还可以使用以下语法对同一个 Promise 进行多个断言

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')
  ]);
});
于 2016-07-06T20:10:24.257 回答