【问题标题】:Received value must be a mock or spy function when mocking a class模拟类时收到的值必须是模拟或间谍函数
【发布时间】: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


【解决方案1】:

run 方法由 DetectFibonacciUseCase 类的实例调用,而不是由类本身调用。

虽然 Jest 自动模拟将按预期工作,但您需要访问模拟类实例以检查是否已调用 run 函数。

const mockDetectFibonacciUseCaseInstance = DetectFibonacciUseCase.mock.instances[0];
expect(mockDetectFibonacciUseCaseInstance.run).toHaveBeenCalled();

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2021-09-02
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多