使用 Sinon 在 Promise 中存根代码并返回 Resolve()

Nda*_*ior 1 javascript unit-testing asynchronous promise sinon

最后一天我一直被困在这个问题上,我决定需要帮助。我有以下 javascript 类方法,我正在为其编写单元测试:

getUser = function(req, res){
  return new Promise(function(resolve, reject){
      User.getByUserId(user_id, function(err, user){
        if (err){
          return reject({ message: defaultErrorMessage })
        } else {
          return user ? resolve() : reject({ message: 'The specified user does not exist.' })
        }
      })
  }).then(function(){

        ....Promise Chain Continues...

})
Run Code Online (Sandbox Code Playgroud)

本质上,我试图做的是编写一个单元测试,用以下内容存根 User.getByUserId mongoose 调用:

let resolvedPromise = sinon.stub().resolves();
sinon.stub(User,'getByUserId').returns(resolvedPromise);
Run Code Online (Sandbox Code Playgroud)

我的想法是,我想删除查找用户并返回已解决的承诺的数据库调用,以便承诺链可以继续,但是我当前的解决方案不允许承诺链继续。

我如何在承诺中包含 sinon 存根并让该存根返回一个 resolve() 以允许承诺链继续?帮助将不胜感激!

dee*_*wan 6

User.getByUserId是一个带有回调的函数。我们不能用returnssinon.stub了点。解决方案是使用yields

sinon.stub(User, 'getByUserId').yields(null, userObj);
Run Code Online (Sandbox Code Playgroud)

参考:

https://sinonjs.org/releases/v7.2.2/stubs/#stubyieldsarg1-arg2-

更新

yields和之间的区别returns可以用下面的例子来描述:

// User.js

/** function with ordinary return **/
function getUser() {
  return { name: 'admin', sex: 'male' };
}

/** function with callback and no return **/
function getUserById(id, callbackFunc) {
  callbackFunc();
}

/** function that return promise **/
function getUserBySex(sex) {
  return getFromDb(); // getFromDb() is a promise function
}
Run Code Online (Sandbox Code Playgroud)

对于测试文件中的 sinon 存根

// test.js

// use `returns` for function with ordinary return
sinon.stub(User, 'getUser').returns({ name: 'whatever', sex: 'female' });

// use `yields` or `callArgsWith` for function that has callback function
sinon.stub(User, 'getUserById').yields(null, userObj);
sinon.stub(User, 'getByUserId').callsArgWith(1, null, userObj); // 1 => second parameter

// use `resolves` for function that returns promise
sinon.stub(User, 'getUserBySex').resolves(userObj);
Run Code Online (Sandbox Code Playgroud)

更多参考: