Мокинг HTTP-ответа с помощью Sinon. js - PullRequest
0 голосов
/ 06 августа 2020

У меня есть AWS Node.JS Lambda, который делает HTTP-запрос, который я хотел бы протестировать с помощью Sinon. JS. Соответствующий фрагмент лямбда-кода:

const postReq = httpsRequest.request(options, (response) => {
    if (response.statusCode == 200) {
        var jsonResponse = "";

        response.on("data", chunk => {
            jsonResponse += chunk;
        });

        response.on("end", () => {
           ...
        }
    }
}

Проблема заключается в насмешке через Sinon:

const sinon = require('sinon');
const httpsRequest = require('https');

...

let expectedHTTPResponse =  {
    "statusCode": 200,
    "errMessage": "",
    "response": { message: "Hello"}
}

const mockRes = (options = {}) => {
    const ret = expectedHTTPResponse;

    return Object.assign(ret, {
      end: sinon.stub().returns(ret),
      on: sinon.stub().returns(ret),
    }, options)
}

let sinonSandbox = sinon.createSandbox();

beforeEach((done) => {
    sinonSandbox.stub(httpsRequest, 'request').yields(expectedHTTPResponse);

    done();
})

Если я передам ожидаемый HTML-ответ , я получаю сообщение об ошибке что:

Error TypeError: response.on is not a function

Хорошо, я понял, что ожидаемый JSON объект, который я передал, не имеет функций на и end . Итак, я попытался создать фиктивный объект ответа ( mockRes , показанный выше), например:

const mockResponse = mockRes();

sinonSandbox.stub(httpsRequest, 'request').yields(mockResponse);

, который отвечал бы на на и end , но я получил другую ошибку. Как вы имитируете объект HTTP-ответа через Sinon. js, где вы можете определить значение ответа?

...