Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 警告:测试中的应用程序更新未包装在酶和挂钩中的act(…)中_Reactjs_Jestjs_React Hooks_Enzyme_Act - Fatal编程技术网

Reactjs 警告:测试中的应用程序更新未包装在酶和挂钩中的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

我已经编写了这个组件。它使用钩子和状态获取数据。获取后,加载状态将更改为false并显示侧栏

我面临着一个玩笑和酶的问题,因为它在我的单元测试中确实对Act发出了警告。一旦我把这个动作加入我的玩笑,测试就失败了

/@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
使其生效:)您是否有一个最小的代码(可能是小型回购)可以重新生成问题?