Как проверить код маршрутизатора, который содержит тяжелую логику, используя sinon и stubbing (nodeJS) - PullRequest
1 голос
/ 26 марта 2019

Я новичок в использовании sinon, поэтому извините, если мой вопрос странный, я искал везде, но не могу найти способ сделать это.

У меня есть приложение с экспресс-роутером. Я хочу написать тест uint для одного из маршрутов. Этот маршрут имеет внутреннюю функцию, которая является «тяжелой», что означает, что он асинхронен с обещанием и в действительности вызывает внешний 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,{});
        });
     });
});

1 Ответ

1 голос
/ 27 марта 2019

Эта строка:

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

... заглушает функцию verifyPayment в модуле экспорта модуля setOrder.


Прямо сейчас setOrderWithGet вызывает функцию verifyPayment напрямую, поэтому на нее не влияют какие-либо изменения в экспорте модуля .


Измените setOrderWithGet на вызов verifyPaymentс помощью модуль экспортирует :

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

... и вам вызовут заглушку.

...