#sinon
#sinon
Вопрос:
Я новичок в использовании sinon, поэтому извините, если мой вопрос странный, я искал везде, но не могу найти способ это сделать.
У меня есть приложение с экспресс-маршрутизатором. Я хочу написать uint-тест для одного из маршрутов. У этого маршрута есть внутренняя функция, которая является «тяжелой», что означает, что она асинхронна с promise, и в действительности вызывает внешний api. Я хочу заглушить эту внутреннюю функцию в тесте, чтобы она не использовала api и возвращала мои собственные данные вместо исходного метода.
Пока это код:
routes/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:
Эта строка:
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
// ...
}
… и ваша заглушка будет вызвана.