测试包含嵌套回调的promise对象

时间:2016-08-04 22:19:14

标签: javascript mocha chai

我有以下函数调用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对象实际上并没有返回任何内容。它会执行res回调。

无论如何都要测试promise对象是否执行回调?

1 个答案:

答案 0 :(得分:1)

上述函数返回Promise的事实对于它的签名无关紧要。您将回调传递给它的事实使得Promise不可用。

解决方案1:重构您的功能

让你的函数返回一个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();
  });
})