Как издеваться над методами экземпляра класса, над которым издевались с помощью jest.mock?

Как можно имитировать методы экземпляра для класса, который имитируется с помощью jest.mock?

Например, над классом Logger высмеивается:

import Person from "./Person";
import Logger from "./Logger";

jest.mock("./Logger");

describe("Person", () => {
  it("calls Logger.method1() on instantiation", () => {
    Logger.method1.mockImplementation(() => {}) // This fails as `method1` is an instance method but how can the instance method be mocked here?
    new Person();
    
    expect(Logger.method1).toHaveBeenCalled();
  });
});

🤔 А знаете ли вы, что...
JavaScript поддерживает работу с различными форматами данных, такими как JSON и XML.


1
19
1

Ответ:

Решено

Создавая макет класса Logger, вы можете указать фабрику модулей в качестве второго аргумента для jest.mock. Вы можете обратиться к документы для получения дополнительной информации.

import Person from "./Person";

const mockConstructor = jest.fn();
const mockMethod1 = jest.fn();

jest.mock("./Logger.js", () => ({
  default: class mockLogger {
    constructor() {
      mockConstructor();
    }
    method1() {
      mockMethod1();
    }
  },
  __esModule: true
}));

it("works", () => {
  const p = new Person();
  expect(mockConstructor).toHaveBeenCalled();
  p.method1();
  expect(mockMethod1).toHaveBeenCalled();
});