Полученное значение должно быть фиктивной или шпионской функцией при издевательстве над классом

#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();