我不熟悉Reaction中的测试,也不知道如何适当地模拟useState值来适当地覆盖使用布尔值作为参数来返回组件的行

react 代码

import React from "react";
import { InputGroup, Input, Button, Spinner, Center } from "@chakra-ui/react";
import movieAPI from "../../services/movieAPI";
import { useNavigate } from "react-router-dom";
import styles from "./index.module.css";
export const Search = () => {
  const navigate = useNavigate();
  const [movie, setMovie] = React.useState("");
  const [isLoading, setLoading] = React.useState(false);
  const handleClick = async () => {
    setLoading(true);
    const data = await movieAPI.fetchMovieByTitle(movie);
    setLoading(false);
    navigate(`/movie/${data.Title}`, { state: data });
  };
  return isLoading ? (
    <Center>
      <Spinner
        data-testid="spinner"
        className={styles.verticalCenter}
        thickness="6px"
        speed="1.0s"
        emptyColor="gray.200"
        color="green.500"
        size="xl"
      />
    </Center>
  ) : (
    <InputGroup m={2} p={2}>
      <Input onChange={(e) => setMovie(e.target.value)} placeholder="Search" />
      <Button onClick={handleClick}>Search</Button>
    </InputGroup>
  );
};

为了覆盖微调组件的特定行,我如何模拟属性加载? 下面是我测试微调控件代码的try

import { render, fireEvent, RenderResult } from "@testing-library/react";
import { Search } from "../../components/search/search";
import { BrowserRouter as Router, useNavigate } from "react-router-dom";
import React from "react";
describe("search.tsx", () => {
  let isLoading = false;
  let setLoading = jest.fn();
  let container: RenderResult<
    typeof import("@testing-library/dom/types/queries"),
    HTMLElement,
    HTMLElement
  >;
  jest.mock("react", () => {
    return {
      ...jest.requireActual("react"),
      useState: () => ({
        isLoading: isLoading,
        setLoading: setLoading,
      }),
    };
  });
  beforeEach(() => {
    container = render(
      <Router>
        <Search />
      </Router>
    );
  });
  it("should render spinner", async () => {
    setLoading.mockImplementation((data) => {
      isLoading = data;
    });
    setLoading(true);
    console.log(await container.findByTestId("spinner"));
  });
});

推荐答案

组件就像测试的黑匣子. 它有两个输入:props 和用户交互.在这些基础上,它呈现了一些东西.你不应该嘲笑useState.您的测试将如下所示:

您可以模拟其他依赖项,如本地存储和/或REST API调用.但没有内部组件实现.

您的测试应该是这样的,用伪代码编写


it("Should show loader while searching for movies", () => {
   // mock the API to return promise which never resolves

   // render component
   // input some search data
   // click the search button
   
   // expect the loader to be visible
});

it("Should reflect text base on user input,", () => {
  // render component
  // input some search data "Start"

  // expect searchInput.text to have value = "Start"
})


Reactjs相关问答推荐

为什么我无法访问窗口事件处理程序中的状态?

无法使用Apollo客户端GraphQL设置Next.js 14

useTranslation不会在languageChanged上重新呈现组件

如何在react 流中使用文本区域和改变 node 的输入大小?

如何用Reaction做交互式的MathML?

FireBase未与Reaction应用程序连接

在Map()完成React.js中的多个垃圾API请求后执行函数

为什么我得不到我想要的数据?

安装使用环境的BIT组件的依赖项

当从子状态更改复制时,react 父状态更改.我该如何防止这种情况?

如何根据ReactJS中元素列表中的布尔值仅显示一次值

使用jest如何覆盖对象的模拟?我正在使用`jest.mock()`来模拟对象,并希望 for each 测试用例覆盖模拟.

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

如何在屏幕上使用相同的可重用

将 ref 转发到所有页面(路由组件)只是为了将其应用于
并具有跳过导航链接(按钮).有没有更好的办法?

使用 React Router v6 监听来自不同组件的组件状态变化

用 jest 测试包裹在 redux 和 router 中的组件

使用输入类型文本对 useState 和日期做出react

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

为什么 React 会多次调用我的应用程序的某些函数?