【问题标题】:How to test router code that contains heavy logic using sinon and stubbing (nodeJS)如何使用 sinon 和存根(nodeJS)测试包含繁重逻辑的路由器代码
【发布时间】:2019-03-26 17:25:32
【问题描述】:

我是使用 sinon 的新手,如果我的问题很奇怪,我很抱歉,我到处找,但找不到方法。

我有带有快速路由器的应用程序。我想为其中一条路线编写 uint 测试。该路由有一个“重”的内部函数,这意味着它与 promise 异步,实际上调用了外部 api。我想在测试中存根那个内部函数,这样它就不会使用 api,并且会返回我自己的数据而不是原始方法。

这是目前为止的代码:

路由/setOrder.js:

// the inner function I want to stub
var verifyPayment = function(saleId) {
  return new Promise((resolve, reject) => {
    logger.info(`verifyPayment: ${saleId}`);
    externalAPICall.get(  // <==this is the 'heavey part!!
      saleId,
      function (error, sale) {
        if(error) {
          return reject(`Error querying sale(${saleId}): ${error}`);
        }
        resolve(sale);
      });
  });
}

router.get('/paymentId/:paymentId', setOrderWithGet);

const setOrderWithGet =async function(req, res, next) {
    const  { paymentId } = req.params;
    verifyPayment(paymentId)
      .then(async sale => {
        try {
          console.log(`sale:${sale}`);
          res.send(JSON.stringify({"status": "ok!" }));
        } catch (err) {
          logger.warn(err)
          res.send(JSON.stringify({"status": "fail.."}));
        }
      })
      .catch(reason => {
        logger.warn(`[] Payment(${paymentId}) is not valid ${reason}`);
        res.send(JSON.stringify({"status": "fail.."}));
      });

}

module.exports = router;
module.exports.setOrderWithGet = setOrderWithGet;
module.exports.verifyPayment = verifyPayment;

setOrderTest.js:

const setOrderStub = require('../routes/setOrder');

describe("POST /setOrder", () => {

    beforeEach(() => {
      sinon.stub(setOrderStub, 'verifyPayment').resolves({....});
    });
    afterEach(() => {
      sinon.restore();
    });

    describe("test1", () => {
        it("setOrder first attempt", () => {
            let req ={params : {'paymentId' : 'mypamentid1'}};
            setOrderStub.setOrderWithGet(req,{});
        });
     });
});

【问题讨论】:

    标签: sinon


    【解决方案1】:

    这一行:

    sinon.stub(setOrderStub, 'verifyPayment').resolves({....});
    

    ...在setOrder 模块的模块导出 上存根verifyPayment 函数。


    现在setOrderWithGet 正在直接调用verifyPayment 函数,因此它不受模块导出的任何更改的影响。


    使用模块导出setOrderWithGet更改为调用verifyPayment

    const setOrderWithGet = async function(req, res, next) {
        // ...
        module.exports.verifyPayment(paymentId)  // <= call the module export for verifyPayment
        // ...
    }
    

    ...你的存根会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2019-01-28
      • 2021-12-10
      相关资源
      最近更新 更多