#javascript #reactjs #unit-testing #jestjs #react-testing-library
Вопрос:
Я пишу тест, чтобы проверить, вызывается ли один метод при выполнении обратного вызова. Тем не менее, это приводит меня к этой ошибке.
expect(received).toHaveBeenCalled()
Matcher error: received value must be a mock or spy function
Received has value: undefined
Согласно шутке, автоматического издевательства над классом, добавления строки jest.mock(...)
должно быть достаточно, чтобы получить издевательский класс, но, похоже, мне здесь чего-то не хватает.
Это мой тестовый файл:
import { render, fireEvent } from "@testing-library/react";
import Grid from "../../components/Grid";
import DetectFibonacciUseCase from "../../useCases/DetectFibonacciUseCase";
jest.mock("../../useCases/DetectFibonacciUseCase");
describe("GridComponent", () => {
test("Should've called the run method when the callback is executed", () => {
const { getByTestId } = render(<Grid />);
const firstCellButton = getByTestId("cell-testid-0-0");
fireEvent.click(firstCellButton);
expect(DetectFibonacciUseCase.run).toHaveBeenCalled();
});
});
Функция обратного вызова выглядит так, и она на самом деле выполняется:
const calculateNewValues = (row, column) => {
const updatedCells = cells.map((cell) => {
cell.value = cell.row === row || cell.column === column
? cell.value 1
: cell.value;
cell.color = cell.row === row || cell.column === column ? ColorConstants.yellow : cell.color;
return cell;
});
const detectFibonacciUseCase = new DetectFibonacciUseCase(
MINIMUM_CONSECUTIVE_APPAREANCES
);
const cellsWithFibonacci = detectFibonacciUseCase.run(updatedCells);
cellsWithFibonacci.forEach((cellWithFibonacci) => {
const cellToUpdateIndex = updatedCells.findIndex(
(cell) =>
cell.row === cellWithFibonacci.row amp;amp;
cell.column === cellWithFibonacci.column
);
updatedCells[cellToUpdateIndex].color = ColorConstants.green;
updatedCells[cellToUpdateIndex].value = 1;
});
setCells(updatedCells);
removeColorsAfterTimeout(updatedCells);
};
Я также пытался использовать этот mockImplementation
метод, но совершенно безуспешно.
Любое предложение будет хорошо воспринято.
Версия шутки: 26.6.0 Версия реакции: 17.0.2 Версия библиотеки для тестирования реакции: ^12.1.2
Комментарии:
1. Где полученный fn используется в вашем тесте?
2. Он используется в пункте ожидания:
expect(DetectFibonacciUseCase.run).toHaveBeenCalled();
Ответ №1:
run
Метод вызывается экземпляром DetectFibonacciUseCase
класса, а не самим классом.
В то время как Jest automock будет работать так, как ожидалось, вам необходимо получить доступ к экземпляру макетного класса, чтобы проверить run
, была ли вызвана функция.
const mockDetectFibonacciUseCaseInstance = DetectFibonacciUseCase.mock.instances[0];
expect(mockDetectFibonacciUseCaseInstance.run).toHaveBeenCalled();