【问题标题】:How to test react functional component async call如何测试反应功能组件异步调用
【发布时间】:2021-03-08 11:06:19
【问题描述】:

我有一个功能组件。在组件内部,我调用了 SpecialistsListService 服务。该服务通过 Axios 调用 API。我必须测试 async function getSpecialistsList 和 useEffect 功能,但我不这样做任何人帮助我解决问题。当我使用类组件时,我只需调用 await wrapper.instance.getSpecialistsList() 之类的方法,然后检查状态,但我认为功能组件方法不同。

import React, { useState, useEffect } from "react";
import SpecialistsListService from "../../../services/specialists";
import SpecialistsPageView from "./SpecialistsPageView";
import "./index.scss";

export default function SpecialistsPage() {
  const [specialistsList, setSpecialistsList] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

  const specialistsListService = new SpecialistsListService();

  useEffect(() => {
    getSpecialistsList();
  }, []);

  async function getSpecialistsList() {
    const specialistsListData = await specialistsListService.getSpecialistsList();
    setSpecialistsList(specialistsListData);
    setIsLoading(false);
  }

  return (
    <SpecialistsPageView isLoading={isLoading} specialists={specialistsList} />
  );
}

【问题讨论】:

  • 你期待测试状态是否更新?
  • @GokulnathP 我必须测试 getSpecialistsList 函数。调用函数状态更新后检查状态更新与否。

标签: javascript reactjs frontend react-testing-library


【解决方案1】:

将您的组件拆分为自定义挂钩和组件,通过拆分 UI 和逻辑,让您的生活更易于测试和更具可读性。

自定义挂钩将如下所示

useSpecialistsList.js

import { useState, useEffect } from "react";

const useSpecialistsList = (specialistsListService) => {
  const [specialistsList, setSpecialistsList] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    getSpecialistsList();
  }, []);

  async function getSpecialistsList() {
    const specialistsListData = await specialistsListService.getSpecialistsList();
    setSpecialistsList(specialistsListData);
    setIsLoading(false);
  }

  return {
    isLoading: isLoading,
    specialistsList: specialistsList
  }
}

export default useSpecialistsList;

组件如下所示

import React from "react";
import SpecialistsListService from "../../../services/specialists";
import SpecialistsPageView from "./SpecialistsPageView";
import useSpecialistsList from "./useSpecialistsList";
import "./index.scss";

export default function SpecialistsPage() {
  const {isLoading, specialistsList} = useSpecialistsList(new SpecialistsListService());

  return (
    <SpecialistsPageView isLoading={isLoading} specialists={specialistsList} />
  );
}

现在您可以使用“@testing-library/react-hooks”测试您的钩子

测试将如下所示

import {renderHook} from "@testing-library/react-hooks";
import useSpecialistsList from "./useSpecialistsList";
import SpecialistsListService from "../../../services/specialists";

describe("useSpecialistsList", ()=>{
  
    it('Should return userDetails loading as false', async ()=> {
        const {result, waitForNextUpdate} = renderHook(()=> useSpecialistsList(new SpecialistsListService()));
        
        expect(result.current.isLoading).toEqual(true);

        await waitForNextUpdate();

        expect(result.current.isLoading).toEqual(false);
    });
})

这里waitForNextUpdate调用useEffect(一般是更新组件)

要阅读有关测试自定义挂钩的更多信息,请使用 this 喜欢

【讨论】:

  • 希望它回答了您的问题?
  • GokulnathP 测试失败。 TypeError:无法读取未定义的属性“getSpecialistsList”
  • 我没有运行它,因为我没有完整的代码。代码是否构建并运行?只有测试失败吗?
  • 以前的代码构建和运行良好。您的代码构建并运行良好。但是测试失败了。我希望考试通过。这就是问题所在。
  • 抱歉,刚刚通知的测试有问题,请稍等
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2019-11-01
相关资源
最近更新 更多