【发布时间】:2021-12-04 17:09:45
【问题描述】:
我正在编写一个测试来检查执行回调时是否调用了一个方法。但是,它让我遇到了这个错误。
expect(received).toHaveBeenCalled()
Matcher error: received value must be a mock or spy function
Received has value: undefined
根据Jest automatic class mocks 添加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 &&
cell.column === cellWithFibonacci.column
);
updatedCells[cellToUpdateIndex].color = ColorConstants.green;
updatedCells[cellToUpdateIndex].value = 1;
});
setCells(updatedCells);
removeColorsAfterTimeout(updatedCells);
};
我也尝试过使用mockImplementation 方法,但完全没有运气。
任何建议都会受到欢迎。
Jest 版本:26.6.0 反应版本:17.0.2 反应测试库版本:^12.1.2
【问题讨论】:
-
收到的 fn 在你的测试中用在哪里?
-
在期望分句中使用:
expect(DetectFibonacciUseCase.run).toHaveBeenCalled();
标签: javascript reactjs unit-testing jestjs react-testing-library