#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 варианта:
- используйте
jest.mock
, встроитеmockClassA
иmockMethod
, разместите их в макете, а затем импортируйте из ‘../src / ClassB’ - используйте doMock, но используйте dynamic
require
в вашем тестовом примере.
Комментарии:
1. Проблема с 1 в том, что я получаю разные экземпляры издевательских методов, поскольку они являются функциями. Не удалось заставить вариант 2 работать, у вас есть пример?
require('../src/ClassB')
похоже, на это не влияет.