测试包含嵌套回调的承诺对象

Testing a promise object which contains a nested callback

我有以下调用 promise 对象的函数

export const project_list = function(data,res){
  return db.any(queries.ProjectList)
    .then(function(results){
      let newResults = project_list_cleaner(results)
      res(null,newResults)
    })
    .catch(function(err){
      res(err)
    })
}

我正在尝试测试下面的功能

  it('should retrieve a list',function(){
    return expect(project_list(data,res)).to.eventually.be.false
  })

这引发了一个错误,因为 promise 对象实际上 return 什么都没有。它执行 res 回调。

有没有办法测试promise对象是否执行回调?

上面的函数 return 是 Promise 的事实与其签名无关。您将回调传递给它这一事实使得 Promise 无法使用。

解决方案 1:重构您的函数

让你的函数 return 成为 Promise,仅此而已。不涉及回调。

export const project_list = function(data){
  return db.any(queries.ProjectList)
    .then(function(results){
      return project_list_cleaner(results)
    });
}

测试将是:

it('should retrieve a list',function(){
  return expect(project_list(data)).to.eventually.be.false
})

解决方案 2:忽略 Promise

在此解决方案中,您无需重构函数(但您确实应该重构!)并按照 Promises 从未存在的方式工作。

it('should retrieve a list',function(done){
  project_list(data, function(err, result){
    // put your assertions here
    done();
  });
})