Модуль Jest not mocking при использовании «doMock», чтобы избежать подъема

#javascript #unit-testing #jestjs

#javascript #модульное тестирование #jestjs

Вопрос:

Я пытаюсь издеваться над классом, который создает и возвращает другой класс. У меня есть это:

 const mockMethod = jest.fn();

const mockClassA = jest.fn<ClassA>(() => ({
  method: mockMethod
}));

jest.mock("../src/ClassB", () => ({
  ClassB: {
    getClassA: () => new mockClassA()
  }
}));
  

Он отключается из-за подъема, mockClassA не определено, когда jest издевается над `../src /ClassB».

Я читал, что если вы не хотите поднимать, просто используйте doMock вместо этого:

При использовании babel-jest вызовы mock автоматически будут подняты в верхнюю часть блока кода. Используйте этот метод, если вы хотите явно избежать такого поведения.

https://jestjs.io/docs/en/next/jest-object#jestdomockmodulename-factory-options

Когда я запускаю с mock , я получаю TypeError: mockClassA is not a constructor , поскольку mockClassA не определен, потому что mock поднят выше определения для mockClassA.

Когда я меняю mock на doMock , он просто не издевается над модулем — он использует реальную вещь.


Редактировать: объявление их в строке означает, что я не могу легко получить доступ к издевательским методам проверки:

 jest.mock("../src/ClassB", () => ({
  ClassB: {
    getClassA: () => ({
      method: jest.fn()
    })
  }
}));
  

Поскольку getClassA это функция, она возвращает отдельный экземпляр объекта с method .


Редактировать 2: Ах! Удалось встроить его вот так:

 jest.mock("../src/ClassB", () => {
  const mockMethod: jest.fn();
  return {
    ClassB: {
      getClassA: () => ({
        method: mockMethod
      })
    }
  };
});
  

Ответ №1:

Я думаю, что здесь у вас есть 2 варианта:

  1. используйте jest.mock , встроите mockClassA и mockMethod , разместите их в макете, а затем импортируйте из ‘../src / ClassB’
  2. используйте doMock, но используйте dynamic require в вашем тестовом примере.

Комментарии:

1. Проблема с 1 в том, что я получаю разные экземпляры издевательских методов, поскольку они являются функциями. Не удалось заставить вариант 2 работать, у вас есть пример? require('../src/ClassB') похоже, на это не влияет.