首页 > 解决方案 > 开玩笑用钩子模拟函数失败

问题描述

我正在使用nextJsjest enzyme测试组件。我有一个像下面这样的组件文件,我从 props 获取数组并循环到它在里面items调用.setRefuseEffect

[itemRefs, setItemRefs] = React.useState([]);

setRef = () => {
     const refArr = [];
     items.forEach(item => {
        const setItemRef = RefItem => {
             refArr.push(RefItem)
        }

       if(item && item.rendItem){
           item.rendItem = item.rendItem.bind(null, setItemRef);
       }
   }
   setItemRefs(refArr);
}

React.useEffect(() => {
   setRef();
},[])

我的测试文件如下:

const items = [
       {
          original: 'mock-picture-link',
          thumbnail: 'mock-thumb-link',
          renderItem: jest.fn().mockReturnValue({ props: { children: {} } })
       }
      ];
     
       beforeEach(() => {
         setItemRefs = jest.fn(),
         jest.spyOn(React, 'useEffect').mockImplementationOnce(fn => fn());
       })
       

    it('mocks item references', ()=>{
        jest.spyOn(React, 'useState').mockImplementationOnce(() => [items, setItemRefs]);
        wrapper = shallow(<Component />).dive();
        expect(setItemRefs).toHaveBeenCalledWith(items);
    })

测试用例失败,因为items数组但收到了一个空白数组。内部工作,但console.log内部不起作用我怀疑这不是开玩笑。if(item && item.rendItem)console.logconst setItemRef = RefItem => {....bind

任何帮助都会很好。

标签: reactjsunit-testingjestjsnext.jsenzyme

解决方案


推荐阅读