1

when i import modules, i mock them with jest.mock() api :

import analytics, { fakeAnalyticsApi } from "../../middleware/analytics";
jest.mock("../../middleware/analytics", () => {
  const orginalModules = jest.requireActual("../../middleware/analytics");
  return {
    __esModule: true,
    ...orginalModules,
    fakeAnalyticsApi: jest.fn(() => Promise.resolve("success")),
  };
});

then when i call "fakeAnalyticsApi" function Its original version is executed.

full test file:

import analytics, { fakeAnalyticsApi } from "../../middleware/analytics";
jest.mock("../../middleware/analytics", () => {
  const orginalModules = jest.requireActual("../../middleware/analytics");
  return {
    __esModule: true,
    ...orginalModules,
    fakeAnalyticsApi: jest.fn(() => Promise.resolve("success")),
  };
});
const create = () => {
  const store = {
    getState: jest.fn(() => {}),
    dispatch: jest.fn(),
  };
  const next = jest.fn();
  const invoke = (action) => analytics(store)(next)(action);
  return { store, next, invoke };
};
// suite test
describe("analytics middleware", () => {
  test("should pass on irrelevant keys", () => {
    const { next, invoke } = create();
    const action = { type: "IRREVELANT" };
    invoke(action);
    expect(next).toHaveBeenCalledWith(action);
    expect(fakeAnalyticsApi).not.toHaveBeenCalled();
  });
  test("should make an analytics API call", () => {
    const { next, invoke } = create();
    const action = {
      type: "REVELANT",
      meta: {
        analytics: {
          event: "REVELANT",
          data: { extra: "stuff" },
        },
      },
    };
    invoke(action);
    expect(fakeAnalyticsApi).toHaveBeenCalled();
    expect(next).toHaveBeenCalledWith(action);
  });
});

and I get the following error:

● analytics middleware › should make an analytics API call

    expect(jest.fn()).toHaveBeenCalled()

    Expected number of calls: >= 1
    Received number of calls:    0

      39 |     };
      40 |     invoke(action);
    > 41 |     expect(fakeAnalyticsApi).toHaveBeenCalled();
         |                              ^
      42 |     expect(next).toHaveBeenCalledWith(action);
      43 |   });
      44 | });

I log a statement in orginal version function of "fakeAnalyticsApi", it seems orginal version was call because the console log the statement

milad shiriyan
  • 296
  • 1
  • 9

1 Answers1

2

I found the problem It was not related to the mock function in the jest If an ES6 module directly exports two functions (not within a class, object, etc., just directly exports the functions like in the question) and one directly calls the other, then that call cannot be mocked.

i implemented fakeAnalyticsApi inside the analytics.js module and exported it to mock it for test purpose , but it doesn`t work.

more details: https://stackoverflow.com/a/55193363/17615078

milad shiriyan
  • 296
  • 1
  • 9