reactjs - 为什么我在测试这个钩子时会看到关于使用 act 的警告?
问题描述
使用“@testing-library/react-hooks”中的 renderHook 时,我无法理解如何在没有以下警告的情况下为钩子编写测试。
“警告:测试中对 TestHook 的更新未包含在 act(...) 中。”
基本上,钩子使用设置初始值,useState
然后在useEffect
钩子中我异步执行一些操作,最终更新状态值。
import React from "react";
// fake request
const fetchData = () => Promise.resolve("data");
export const useGetData = () => {
const initialData = { state: "loading" };
const [data, setData] = React.useState(initialData);
React.useEffect(() => {
fetchData()
.then(() => setData({ state: "loaded" }));
}, []);
return data;
};
钩子总是简单地返回状态值。所以我写了一个测试来断言它首先返回初始值并最终返回新的状态值。
import { renderHook } from "@testing-library/react-hooks";
import { useGetData } from "./useGetData";
describe("useGetData", async () => {
it('Should initially return an object with state as "loading"', () => {
const { result } = renderHook(() => useGetData());
expect(result.current).toEqual({ state: "loading" });
});
it('Should eventually return an object with state as "loaded"', async () => {
const { result, waitForNextUpdate } = renderHook(() => useGetData());
await waitForNextUpdate();
expect(result.current).toEqual({ state: "loaded" });
});
});
我创建了一个复制此的沙箱: https ://codesandbox.io/s/dazzling-faraday-ht4cd?file=/src/useGetData.test.ts
我已经研究了这个警告的含义和行为是什么......但对于这个特定的场景,我不确定缺少什么。
解决方案
您可以通过以下方式修复它:
await act(async () => {
await waitForNextUpdate();
});
您需要包装任何将通过该函数更新状态的act
函数
推荐阅读
- powershell - 需要 Powershell 命令来避免内存错误
- apache-spark - Spark结构化流文件处理非常慢,当启用清洁源存档时
- javascript - 使用 JavaScript,如何增加数组中的所有项并返回数组?
- javascript - 向迷你图添加过渡不起作用
- javascript - 为什么 react-beautiful-dnd 在简单列表中拖放时会摇晃?
- c# - .net 5.0 集成测试,未找到健康检查端点
- firebase - 只允许从文档中的 uid 更新(firestore 安全规则)?
- javascript - React - 给我的子组件一个功能
- c - 如何计算字典中单词中两个首字母的频率?
- algorithm - 如果 IP 在范围列表中,则过滤它们