【问题标题】:Return array from jest mock with React Hook使用 React Hook 从 jest mock 中返回数组
【发布时间】:2021-05-25 23:40:40
【问题描述】:

我正在尝试为使用 useEffect 和 use/createContext 的自定义钩子创建一个模拟,最终只返回如下所示的内容:

[{ users: 0, hoursTested: 0, testDrives: 0 }, null];

我的代码如下:

import React from "react";
import { render, screen } from "@testing-library/react";
import BetaResults from "./BetaResults";

var mockResults = [{ users: 0, hoursTested: 0, testDrives: 0 }, null];
jest.mock("services/EAPStats/useEAPStats", () => {
  console.log("In Mock");
  return jest.fn(() => {
    console.log("In jest.fn");
    console.log("mock results", mockResults);
    return mockResults;
  });
});
test("renders BetaResults", async () => {
  mockResults = [{ users: 10, hoursTested: 10, testDrives: 10 }, undefined];
  render(<BetaResults />);
  expect(screen.getAllByTestId("BetaResultsHeaderText").length).toEqual(1);
});

当我执行测试时收到此错误:

Error: Uncaught [TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))]

执行永远不会到达用 jest.fn 定义的函数。我忽略了什么?

【问题讨论】:

    标签: reactjs jestjs react-hooks react-testing-library


    【解决方案1】:

    所以我最终选择了一条不同的路线,并认为我会发布我为其他努力实现围绕 React 钩子和 fetch 调用的测试的人所做的事情。我没有做所有的嘲笑工作,而是选择了 msw,它更干净。下面是代码:

    import React from "react";
    import { render, screen, waitFor } from "@testing-library/react";
    import BetaResults from "./BetaResults";
    import { rest } from "msw";
    import { setupServer } from "msw/node";
    
    const server = setupServer(
      rest.get("/api/EAPStats.json", (req, res, ctx) => {
        return res(ctx.json({ users: 10, hoursTested: 1000, testDrives: 100 }));
      })
    );
    
    beforeAll(() => server.listen());
    afterEach(() => server.resetHandlers());
    afterAll(() => server.close());
    test("renders BetaResults", async () => {
      render(<BetaResults />);
      // Wait for the hook to fire and retrieve data. Initial render is loading component.
      await waitFor(() => screen.getByTestId("resultsBackground"));
      expect(screen.getByTestId("hoursTested").innerHTML).toEqual("1000");
      expect(screen.getByTestId("users").innerHTML).toEqual("10");
      expect(screen.getByTestId("testDrives").innerHTML).toEqual("100");
    });
    

    非常简单明了,很容易了解如何对此进行扩展。

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 2021-03-04
      • 2021-12-13
      • 2019-03-03
      • 2021-09-13
      • 2022-11-24
      • 1970-01-01
      • 2021-02-20
      • 2020-12-04
      相关资源
      最近更新 更多