Estoy escribiendo una prueba para comprobar que se llama a un método cuando se ejecuta la devolución de llamada. Sin embargo, me está dando este error.
expect(received).toHaveBeenCalled() Matcher error: received value must be a mock or spy function Received has value: undefined De acuerdo con los simulacros automáticos de clase de Jest, agregar la línea jest.mock(...) debería ser suficiente para obtener una clase simulada, pero parece que me falta algo aquí.
Este es mi archivo de prueba:
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(); }); });La función de devolución de llamada se ve así, y en realidad se está ejecutando :
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 && cell.column === cellWithFibonacci.column ); updatedCells[cellToUpdateIndex].color = ColorConstants.green; updatedCells[cellToUpdateIndex].value = 1; }); setCells(updatedCells); removeColorsAfterTimeout(updatedCells); }; También intenté usar el método de mockImplementation , pero sin suerte. Cualquier sugerencia es bien recibida.
Versión Jest: 26.6.0 Versión React: 17.0.2 Versión React-testing-library: ^12.1.2
El método de run es llamado por una instancia de la clase DetectFibonacciUseCase , no por la propia clase.
Si bien Jest automock funcionará como se esperaba, debe acceder a la instancia de clase simulada para verificar si se ha llamado a la función de run .
const mockDetectFibonacciUseCaseInstance = DetectFibonacciUseCase.mock.instances[0]; expect(mockDetectFibonacciUseCaseInstance.run).toHaveBeenCalled();