【问题标题】:How to mock https.get with Jest如何用 Jest 模拟 https.get
【发布时间】:2021-08-12 20:26:55
【问题描述】:

我有一个函数在我想用 Jest 测试的 Promise 中调用 https.get。

函数是这样的:

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)
        });
    });
    
  })
}

我想测试当函数在“结束”时解析并在“错误”时拒绝;

目前我有一个这样的测试,但因为 .on("end") 没有被调用,所以承诺永远不会解决。

describe("request", () => {

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

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

})

如何模拟要调用的 .on("end") 之类的事件并确保 Promise 得到解决?

【问题讨论】:

    标签: javascript node.js testing promise jestjs


    【解决方案1】:

    你可以这样做。

    // ./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;
    

    请注意,如果要模拟 https,则需要在 const request = require("./request"); 之前调用 jest.mock('https', ...)。

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2021-02-15
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多