Я хочу проверить маршрут, который выполняет внешние вызовы API. Я хотел бы заглушить functionThatShouldBeStubbed
, чтобы я мог пропустить внешний вызов API и вместо этого сосредоточиться на тестировании маршрута.
Я использую Sinon и rewire, потому что если я правильно понял, я не смогу заглушить функцию, которая была экспортируется так, как оно есть в настоящее время.
Однако, похоже, что даже если rewire заменил функцию, мой тест все еще выполняет внешний вызов API. Кажется, что sinon не знает, что функция была перемонтирована. Как я могу заставить эту ситуацию работать?
//--------------------------
//../target.js
const functionThatShouldBeStubbed = async () => {
const results = await external_API_call();
return results;
}
module.exports = {
functionThatShouldBeStubbed,
/*more other functions*/
}
//--------------------------
//../index.js
app.use(require('endpoint.js'));
//--------------------------
//endpoint.js
const { functionThatShouldBeStubbed } = require("target.js");
router.post('endpoint', async(req, res) => {
//do lots of stuff
const results = await functionThatShouldBeStubbed();
if(results.error) { return res.status(207).send({ /*stuff */})}
//...more stuff
})
//--------------------------
//test.js
const server = require("../index.js");
const rewire = require('rewire')
const restoreTarget = rewire('../target.js');
describe("Should return appropriate error code to requester", function () {
it("Should return 207 in this case", function (done) {
const targetStub = sinon.stub().resolves({msg: 'fake results', statusCode: 207})
const targetRewired = restoreTarget.__set__("functionThatShouldBeStubbed", targetStub);
chai.request(server)
.post("/endpoint")
.send('stuff over')
.catch((error) => {
console.log("Error: ", error)
done();
})
.then((res) => {
expect(targetStub.callCount).to.equal(1);
res.should.have.status(207);
restoreTarget();
targetStub.restore();
done();
})
})
})
Большое спасибо! Редактировать: обновленный код для более подробной информации Редактировать2: снова обновил код для отображения метода импорта