Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Sinon在承诺中存根代码并返回解析()_Javascript_Unit Testing_Asynchronous_Promise_Sinon - Fatal编程技术网

Javascript 使用Sinon在承诺中存根代码并返回解析()

Javascript 使用Sinon在承诺中存根代码并返回解析(),javascript,unit-testing,asynchronous,promise,sinon,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: defaultErrorMes

我在这件事上纠缠了一天,我决定需要帮助。我有以下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...

})
本质上,我试图做的是编写一个单元测试,用以下代码来清除User.getByUserId mongoose调用:

let resolvedPromise = sinon.stub().resolves();
sinon.stub(User,'getByUserId').returns(resolvedPromise);
我的想法是,我想去掉查找用户的DB调用,并返回一个已解决的承诺,以便承诺链可以继续,但是我当前的解决方案不允许承诺链继续

我如何在承诺中拥有sinon存根,并让该存根返回允许承诺链继续的解析?非常感谢您的帮助

User.getByUserId是一个带有回调的函数。我们不能用sinon.stub的退货来做这件事。解决办法是使用收益率

参考:

更新

收益率和收益率之间的差异可以用下面的例子来描述:

// 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
}
对于测试文件中的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);
更多参考资料:

User.getByUserId是一个带有回调的函数。我们不能用sinon.stub的退货来做这件事。解决办法是使用收益率

参考:

更新

收益率和收益率之间的差异可以用下面的例子来描述:

// 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
}
对于测试文件中的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);
更多参考资料:


@迪尔万:非常感谢!这很有效。收益率和收益率有什么区别?我举了更多的例子,希望能帮助你理解differences@deerwan谢谢!这很有效。收益率和收益率的区别是什么?我举了更多的例子,希望能帮助你理解这些区别