最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to mock https.get with Jest - Stack Overflow

programmeradmin1浏览0评论

I have a function that calls https.get inside a promise which I want to test with Jest.

The function is like this:

const request = (url) => {

  return new Promise((resolve, reject) => {
    const chunks = [];
    
    https.get(url, (stream) => {
      stream
        .on('data', (chunk) => {
          if( chunk ) {
            chunks.push(JSON.parse(chunk));
          }
        })
        .on('error', (err) => {
          reject(err);
        })
        .on('end', () => {
          const data = doSomething(chunks);
          resolve(data)
        });
    });
    
  })
}

I want to test that when the function resolves on "end" and rejects on "error";

Currently I have a test like this but because .on("end") doesn't get called, the promise never resolves.

describe("request", () => {

  it("Should resolve", async (done) => {
    
    const response = await request("my-url");

    expect(response).toEqual("some-data")
  })

})

How can I mock events like .on("end") to be called and ensure the promise resolves?

I have a function that calls https.get inside a promise which I want to test with Jest.

The function is like this:

const request = (url) => {

  return new Promise((resolve, reject) => {
    const chunks = [];
    
    https.get(url, (stream) => {
      stream
        .on('data', (chunk) => {
          if( chunk ) {
            chunks.push(JSON.parse(chunk));
          }
        })
        .on('error', (err) => {
          reject(err);
        })
        .on('end', () => {
          const data = doSomething(chunks);
          resolve(data)
        });
    });
    
  })
}

I want to test that when the function resolves on "end" and rejects on "error";

Currently I have a test like this but because .on("end") doesn't get called, the promise never resolves.

describe("request", () => {

  it("Should resolve", async (done) => {
    
    const response = await request("my-url");

    expect(response).toEqual("some-data")
  })

})

How can I mock events like .on("end") to be called and ensure the promise resolves?

Share Improve this question asked Aug 11, 2021 at 16:41 Stretch0Stretch0 9,31315 gold badges94 silver badges159 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 6

You can do something like this.

// ./request.test.js
jest.mock('https', () => ({
  methodToMock: {}
}));

const Stream = require('stream');
const request = require("./request");
const httpsMock = require("https");

describe("request", () => {

  it("Should resolve", async () => {

    var streamStream = new Stream()
    httpsMock.get = jest.fn().mockImplementation((url, cb) => {

      cb(streamStream)

      streamStream.emit('data', 'some');
      streamStream.emit('data', '-');
      streamStream.emit('data', 'data');

      streamStream.emit('end'); // this will trigger the promise resolve
    })

    const response = await request("my-url");

    expect(response).toEqual("some-data");
  })

})
const https = require("https");

const request = (url) => {

    return new Promise((resolve, reject) => {
        const chunks = [];

        https.get(url, (stream) => {
            stream
                .on('data', (chunk) => {
                    if (chunk) {
                        // chunks.push(JSON.parse(chunk));
                        chunks.push(chunk);
                    }
                })
                .on('error', (err) => {
                    reject(err);
                })
                .on('end', () => {
                    // const data = doSomething(chunks);
                    const data = chunks.join('');
                    resolve(data)
                });
        });

    })
}

module.exports = request;

Note that jest.mock('https', ...) need to be called before const request = require("./request"); if you want https to be mocked.

发布评论

评论列表(0)

  1. 暂无评论