Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 如何存根Promise以便我的测试可以同步运行?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过对其中一个依赖项(在本例中为UserManager)进行存根来对模块进行单元测试

该模块的简化版本如下:

// CodeHandler
module.exports = function(UserManager) {
  return {
    oAuthCallback: function(req,res) {
      var incomingCode = req.query.code;
      var clientKey = req.query.key;
      UserManager.saveCode(clientKey,incomingCode)
        .then(function(){
          res.redirect('https://test.tes');
        }).catch(function(err){
          res.redirect('back');
        }
      );
    }
  };
};

我正在对UserManager的saveCode函数进行存根,该函数返回一个Promise,使得它返回一个已解析的Promise,但是当我断言已经调用res.redirect时,在断言res.redirect时尚未调用.

单元测试的简化版本是:

// test
describe('CodeHandler',function() {
  var req = {
    query: {
      code: 'test-code',key: 'test-state'
    }
  };

  var res = {
    redirect: function() {}
  };

  var expectedUrl = 'https://test.tes';
  var ch;

  beforeEach(function() {
    sinon.stub(UserManager,'saveCode').returns(
      new RSVP.Promise(function(resolve,reject){
        resolve();
      })
    );

    sinon.stub(res,'redirect');

    ch = CodeHandler(UserManager);
  });

  afterEach(function() {
    UserManager.saveCode.restore();
    res.redirect.restore();
  });

  it('redirects to the expected URL',function(){
    ch.oAuthCallback(req,res);
    assert(res.redirect.calledWith(expectedUrl));
  })
});

如何正确地保留承诺,以便被测方法同步运行?

解决方法

我用 sinon-stub-promise制定了一个解决方案.

describe('CodeHandler',key: 'test-state'
    }
  };
  var ch;
  var promise;

  var res = {
    redirect: function() {}
  };

  beforeEach(function() {
    promise = sinon.stub(UserManager,'saveCode').returnsPromise();
    ch = CodeHandler(UserManager);
    sinon.stub(res,'redirect');
  });

  afterEach(function() {
    UserManager.saveCode.restore();
    res.redirect.restore();
  });

  describe('can save code',function() {
    var expectedUrl = 'https://test.tes';

    beforeEach(function() {
        promise.resolves();
    });

    it('redirects to the expected URL',function(){
      ch.oAuthCallback(req,res);
      assert(res.redirect.calledWith(expectedUrl));
    });
  });

  describe('can not save code',function() {
    var expectedUrl = 'back';

    beforeEach(function() {
        promise.rejects();
    });

    it('redirects to the expected URL',res);
      assert(res.redirect.calledWith(expectedUrl));
    })
  })
});

这非常有效.

大佬总结

以上是大佬教程为你收集整理的node.js – 如何存根Promise以便我的测试可以同步运行?全部内容,希望文章能够帮你解决node.js – 如何存根Promise以便我的测试可以同步运行?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: