Reactjs 如何使用Jest和Ezyme对useEffect清理返回函数进行单元测试

Reactjs 如何使用Jest和Ezyme对useEffect清理返回函数进行单元测试,reactjs,jestjs,enzyme,Reactjs,Jestjs,Enzyme,我尝试了很多场景,但都没有成功,我面临着useEffect清理返回方法的问题。寻找一些解决方案来覆盖用例。由于声誉降低,无法附加屏幕截图 我做了一些研究,并遵循提供的解决方案,如创建间谍、挂载、卸载场景。但都不管用 useEffect(() => { window.addEventListener('scroll', handleScroll); window.addEventListener('resize', handleResize); return () =

我尝试了很多场景,但都没有成功,我面临着useEffect清理返回方法的问题。寻找一些解决方案来覆盖用例。由于声誉降低,无法附加屏幕截图

我做了一些研究,并遵循提供的解决方案,如创建间谍、挂载、卸载场景。但都不管用

useEffect(() => {
    window.addEventListener('scroll', handleScroll);
    window.addEventListener('resize', handleResize);
    return () => {
       window.removeEventListener('scroll', handleScroll);
       window.removeEventListener('resize', handleResize);
    };
}, []);

useEffect函数中的return语句需要测试覆盖率


请原谅输入错误-从手机上发布。

React不会在同步模式下运行挂钩

从“React”导入React;
从“反应测试库”导入{cleanup,render};
每次之后(清理);
它(“反应测试”,()=>{
设a=假;
功能测试(){
React.useffect(()=>{
a=真;
});
返回你好世界;
}
const{rerender}=render();
重新加载();
期望(a)是(真的);

});为了运行在useEffect钩子中指定的清理函数,您可以缓存对它的引用,然后在稍后的测试中调用该引用:

let cleanupFunc;

jest.spyOn(React, "useEffect").mockImplementationOnce(func => {
    cleanupFunc = func();
});

cleanupFunc();

根据@thomas rufflo的回答,值得指出的是:

从“react”导入{useffect};
不起作用。您必须使用:

React.useffect
摘自这篇博文:


我是新的前端测试,所以这让我绊倒了一段时间

我建议您结账。该库提供了一个
unmount
方法,该方法从其
render
方法返回。调用
unmount()
后,可以检查侦听器是否已被删除。一般来说,我非常推荐react测试库。我们将它与jest结合用于所有前端测试,它的工作方式非常有魅力

卸载方法的示例用法:

import { render } from "@testing-library/react";

it("Should do what I want", () => {
  const { unmount } = render(
    <MyComponent value="test" } />
  );

  unmount();

  // ... expects
});
从“@testing library/react”导入{render}”;
它(“应该做我想做的事”,()=>{
常量{unmount}=render(
);
卸载();
//…期望
});

对于像我一样无法让公认答案生效的人:

jest.spyOn(React,“useffect”).mockImplementationOnce(cb=>cb())


将第二个
()
添加到回调可以执行清理。

谢谢,它会同时包括onScroll和resize方法吗?将立即尝试按照您的建议尝试您的解决方案,但它仍然不包括我的用例您是否尝试了wrapper.unmount()(酶方法)?如果您能提供代码沙盒链接和您编写的测试用例,这会更好。易于修复或帮助。