Javascript 如何模拟一个返回承诺的函数,并用精确的参数验证它

Javascript 如何模拟一个返回承诺的函数,并用精确的参数验证它,javascript,mocha.js,sinon,es6-promise,Javascript,Mocha.js,Sinon,Es6 Promise,我想模拟一个返回承诺的数据库调用。然后我想验证它是否用精确的参数调用 func(data) { let formattedData = formatData(data); return DbClient.saveData(formattedData).then(() => { return { "ok": true } }).catch(() => { return { "ok": false } }); } 我的测试用例是 it("", (

我想模拟一个返回承诺的数据库调用。然后我想验证它是否用精确的参数调用

func(data) {
  let formattedData = formatData(data);
  return DbClient.saveData(formattedData).then(() => {
      return { "ok": true }
  }).catch(() => {
      return { "ok": false }
  });
}
我的测试用例是

it("", (done) => {
   let dbMock = sinon.mock(DbClient).expects("saveData");
   dbMock.returns(Promise.resolve({ "ok": true }));
   dbMock.withExactArgs(formattedData);  
   func(data).then(resp => {
      try{
         dbMock.verify();
         expect(resp).to.deep.equal({ "ok": true });
         done();
      } catch(err) {
         done(err);
      }
   })
});
当我使用
dbMock.withExactArgs(formattedData)

如果我给出了正确的
formattedData
,那么它就通过了,当我尝试使用其他参数而不是
formattedData
使测试失败时,承诺没有解决,因此我得到了以下错误:

错误:超时超过3000毫秒。确保在此测试中调用了done()回调。


**当我删除
dbMock.withExactArgs(formattedData)
时,我的测试通过了,因为模拟正在解决承诺。

我已经复制了您描述的内容,使用您的代码并根据您的描述添加代码。您显示的代码中唯一的问题是
func
没有返回其承诺。你需要:

function func(data) {
  let formattedData = formatData(data);
  return DbClient.saveData(formattedData).then(() => {
      return { "ok": true }
  }).catch(() => {
      return { "ok": false }
  });
}

我已经复制了您描述的内容,使用您的代码并根据您的描述添加代码。您显示的代码中唯一的问题是
func
没有返回其承诺。你需要:

function func(data) {
  let formattedData = formatData(data);
  return DbClient.saveData(formattedData).then(() => {
      return { "ok": true }
  }).catch(() => {
      return { "ok": false }
  });
}

实际上,我的func正在返回一个承诺,我忘了在代码[现在更新]中提到它。但我仍然有同样的问题,它正在等待问题中提到的承诺解决或拒绝。实际上,我的func正在返回一个承诺,我忘记在代码[现在更新]中提到了。但我仍然有同样的问题,那就是等待问题中提到的承诺解决或拒绝。