Reactjs 警告:测试中的应用程序更新未包装在酶和挂钩中的act(…)中
我已经编写了这个组件。它使用钩子和状态获取数据。获取后,加载状态将更改为false并显示侧栏 我面临着一个玩笑和酶的问题,因为它在我的单元测试中确实对Act发出了警告。一旦我把这个动作加入我的玩笑,测试就失败了Reactjs 警告:测试中的应用程序更新未包装在酶和挂钩中的act(…)中,reactjs,jestjs,react-hooks,enzyme,act,Reactjs,Jestjs,React Hooks,Enzyme,Act,我已经编写了这个组件。它使用钩子和状态获取数据。获取后,加载状态将更改为false并显示侧栏 我面临着一个玩笑和酶的问题,因为它在我的单元测试中确实对Act发出了警告。一旦我把这个动作加入我的玩笑,测试就失败了 /@flow 从“React”导入React,{useffect,useState}; 从“../components/Sidebar”导入侧栏; 从“../apiWrappers/fetchData”导入fetchData; 常量应用=()=>{ const[data,setData
/@flow
从“React”导入React,{useffect,useState};
从“../components/Sidebar”导入侧栏;
从“../apiWrappers/fetchData”导入fetchData;
常量应用=()=>{
const[data,setData]=useState([]);
const[loading,setLoading]=useState(true);
useffect(()=>{
const getData=async()=>{
试一试{
const newData=等待获取数据();
setData(newData);
设置加载(假);
}
捕获(e){
设置加载(假);
}
};
getData();
//eslint禁用下一行
}, []);
返回(
{!正在加载
?
:加载列表}
);
};
导出默认应用程序代码>这个问题一点也不新鲜。您可以在此处阅读完整的讨论:
总而言之,当前为了修复act
警告,您必须等待一段时间,然后才能更新包装器,如下所示:
const waitForComponentToPaint=async(包装器)=>{
等待动作(异步()=>{
等待新承诺(resolve=>setTimeout(resolve));
wrapper.update();
});
};
测试('加载后',异步()=>{
const wrapper=mount();
expect(wrapper.find('span').at(0.text()).toEqual('Loading List');
//在状态更新之前
等待等待组件上漆(包装);
//状态更新后
expect(wrapper.find('span').exists()).toEqual(false);
expect(wrapper.html()).toMatchSnapshot();
});
谢谢你的评论,我实际上已经阅读了链接。我刚刚试过你的代码。但是,即使在使用代码之后,我也会收到相同的警告。绕过它的唯一方法是用这样的动作来包装我的整个测试<代码>test.only('After load',async()=>{await act(async()=>{/*实际测试*/});})代码>但那太多了!!我在我的中使用了useffect
,但是为我实现它很复杂。你有没有其他建议可以不用包装我的每一个测试?尝试增加超时wait new Promise(resolve=>setTimeout(resolve,20))
检查是否有帮助?或者您也可以尝试将上述代码包装在act()
中,我想我已经尝试过,并将时间增加到100,但仍然得到了警告。如果我将上述代码包装在act中,我将得到另一个警告。到目前为止,它唯一的工作方式是这样的:但是,我不想在每个测试中都这样做,它有点太多,有点混乱。你知道我可以简化它吗?:)我认为我们不必使用等待expect
使其生效:)您是否有一个最小的代码(可能是小型回购)可以重新生成问题?