PeterDanis
PeterDanis

Reputation: 9316

Jest test .toBeInstanceOf(Error) fails

I have trouble checking whether promise rejects with error in Jest test.

(post Jest 20 version:)

  test("Rejects on error", () => {
    expect.assertions(1);
    return expect(promiseHttpsGet(null)).rejects.toBeInstanceOf(Error);
  });

(pre Jest 20 version)

  test("Rejects on error", () => {
    expect.assertions(1);
    return promiseHttpsGet(null).catch((err) => {
      expect(err).toBeInstanceOf(Error);
    });
  });

I have tried both versions but Jest test fails with:

Expected value to be an instance of:
  "Error"
Received:
  [Error: connect ECONNREFUSED 127.0.0.1:443]
Constructor:
  "Error"

And the promise returning function is:

function promiseHttpsGet(url) {
  return new Promise((resolve, reject) => {
    https
      .get(url, (response) => {
        let responseBody = "";
        if (response.statusCode !== 200) {
          reject(response.statusCode);
        }
        response.setEncoding = "utf8";
        response.on("data", (data) => {
          responseBody += data;
        });
        response.on("end", () => {
          resolve(responseBody);
        });
      })
      .on("error", (error) => {
        reject(error);
      });
  });
}

Any leads how to solve it? Thanks.

Upvotes: 11

Views: 8603

Answers (2)

user64204
user64204

Reputation: 287

Standard jest idiocy, see: https://github.com/facebook/jest/issues/2549 for explanation. TL;DR Jest globals differ from Node globals and thus jest Error != node Error

Upvotes: 3

PeterDanis
PeterDanis

Reputation: 9316

From Jest 23 onwards toThrow matcher can be used for promise returning functions.

  test("Rejects on error", () => {
    expect.assertions(1);
    return expect(promiseHttpsGet(null)).rejects.toThrow(Error);
  });

Or the async/await version:

  test("Throws on error", async () => {
    expect.assertions(1);
    await expect(promiseHttpsGet(null)).rejects.toThrow(Error);
  });

Upvotes: 5

Related Questions