Return 来自带有 React Hook 的笑话模拟的数组
Return array from jest mock with React Hook
我正在尝试为使用 useEffect 和 use/createContext 的自定义挂钩创建模拟,最终只是 returns 看起来像这样的东西:
[{ 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 定义的函数。我忽略了什么?
所以我最终选择了一条不同的路线,并认为我会 post 我为其他努力围绕 React 挂钩和获取调用实施测试的人所做的事情。我没有做所有嘲笑的事情,而是选择了 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");
});
非常简单明了,很容易看出如何对此进行扩展。
我正在尝试为使用 useEffect 和 use/createContext 的自定义挂钩创建模拟,最终只是 returns 看起来像这样的东西:
[{ 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 定义的函数。我忽略了什么?
所以我最终选择了一条不同的路线,并认为我会 post 我为其他努力围绕 React 挂钩和获取调用实施测试的人所做的事情。我没有做所有嘲笑的事情,而是选择了 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");
});
非常简单明了,很容易看出如何对此进行扩展。