Модульный тест: заглушка / перезапись функции внутри запроса к серверу - PullRequest
0 голосов
/ 26 января 2020

Я хочу проверить маршрут, который выполняет внешние вызовы 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: снова обновил код для отображения метода импорта

1 Ответ

0 голосов
/ 26 января 2020

Вам не нужно вообще вводить rewire в зависимости от того, как экспортируется ваш модуль. Следующее должно работать

//test.js
const target = require ("../target");
const server = require("../index");

describe("Should return appropriate error code to requester", () => {
  it("Should return 207 in this case", done => {
    const targetStub = sinon
      .stub(target, "functionThatShouldBeStubbed")
      .resolves({msg: 'fake results', statusCode: 207})
    chai.request(server)
      .post("/endpoint")
      .send('stuff over')
      .then(res => {
         expect(targetStub.callCount).to.equal(1);
         res.should.have.status(207);
         targetStub.restore();
         done();
      })
  })
})
...