Javascript 获得';arr[Symbol.iterator]不是一个函数';使用自定义api钩子时

Javascript 获得';arr[Symbol.iterator]不是一个函数';使用自定义api钩子时,javascript,reactjs,unit-testing,jestjs,react-hooks,Javascript,Reactjs,Unit Testing,Jestjs,React Hooks,我已经编写了一个自定义钩子,使api调用返回结果和错误(如果存在)。当尝试为使用自定义钩子的组件设置Jest测试权限时,在使用Jest shallow()时钩子前面会出现'arr[Symbol.iterator]不是函数'或'Cannot read property'Symbol(Symbol.iterator)'的'undefined' 我觉得这是一个api响应与承诺一起工作的问题,所以我尝试了各种不同的方法。这并不能解决问题 我的自定义api挂钩 /* Packages */ import

我已经编写了一个自定义钩子,使api调用返回结果和错误(如果存在)。当尝试为使用自定义钩子的组件设置Jest测试权限时,在使用Jest shallow()时钩子前面会出现'arr[Symbol.iterator]不是函数'或'Cannot read property'Symbol(Symbol.iterator)'的'undefined'

我觉得这是一个api响应与承诺一起工作的问题,所以我尝试了各种不同的方法。这并不能解决问题

我的自定义api挂钩

/* Packages */
import { useEffect, useState } from 'react';

export const useApiCall = (endPoint) => {
    const [hasError, setHasErrors] = useState(false);
    const [fetchData, setFetchData] = useState(null);

    const getData = async () => {
        try {
            const response = await fetch(endPoint);

            if (!response.ok) {
                throw Error(response.statusText);
            }

            const responseJSON = await response.json();

            setFetchData(responseJSON.data);
        }
        catch (error) {
            setHasErrors(true);
        }
    }

    useEffect(() => {
        getData()
    },[])

    return [fetchData, hasError]
}
我的部件使用挂钩

/* Packages */
import React, { useState } from 'react';

/* Utils */
import { useApiCall } from '../../utils/useApiCall';

/* Components */
import FooterStructure from './FooterStructure'

const Footer = () => {
    const [footerLinks, error] = useApiCall('http://www.mocky.io/v2/5d7678f93200000362297bae');
    const [visible, setVisible] = useState();

    const showContent = () => {
        setVisible(!visible);
    }

    const componentProps = {
        footerLinks : footerLinks,
        error : error,
        visible : visible,
        showContent : showContent
    };

    return (
        <FooterStructure {...componentProps} />
    )
};

export default Footer;
/*软件包*/
从“React”导入React,{useState};
/*乌提尔斯*/
从“../../utils/useApiCall”导入{useApiCall};
/*组成部分*/
从“./FooterStructure”导入FooterStructure
常量页脚=()=>{
const[footerLinks,error]=useApiCall('http://www.mocky.io/v2/5d7678f93200000362297bae');
const[visible,setVisible]=useState();
const showContent=()=>{
setVisible(!visible);
}
常量组件props={
页脚链接:页脚链接,
错误:错误,
可见的,可见的,
showContent:showContent
};
返回(
)
};
导出默认页脚;
我没有承诺的玩笑测试

import { shallow, mount } from 'enzyme';
import Footer from '.';
import mock from './__mocks__/FooterLinks';
import { useApiCall } from '../../utils/useApiCall';
import { testHook } from '../../utils/TestUtils';

jest.mock('../../utils/useApiCall');

let footerData,
    wrapper;

beforeEach(() => {
    wrapper = shallow(<Footer />);

    testHook(async () => {
        useApiCall.mockImplementation(() => Promise.resolve({ data: mock }));
        useApiCall().then((resolve)=>{
            footerData = resolve;
        })
        // This promise gives the same error
        // .then(()=>{
        //     wrapper = shallow(<Footer />);
        // })
        // .catch((error)=>{
        //     console.log(error);
        // });
    });
});

describe('Footer links', () => {
    it('should have 3 links', () => {
        expect(footerData.data.length).toEqual(3);
    });
});

从'enzyme'导入{shall,mount};
从“”导入页脚;
从“/”mock\uuuu/FooterLinks”导入模拟;
从“../../utils/useApiCall”导入{useApiCall};
从“../../utils/TestUtils”导入{testHook};
jest.mock('../../utils/useApiCall');
让我们看看数据,
包装纸;
在每个之前(()=>{
包装器=浅();
testHook(异步()=>{
useApiCall.mockImplementation(()=>Promise.resolve({data:mock}));
useApiCall()。然后((解析)=>{
footerData=解析;
})
//这个承诺也有同样的错误
//.然后(()=>{
//包装器=浅();
// })
//.catch((错误)=>{
//console.log(错误);
// });
});
});
描述('页脚链接',()=>{
它('应该有3个链接',()=>{
expect(footerData.data.length).toEqual(3);
});
});
错误

  Footer links
    ✕ should have 3 links (46ms)

  ● Footer links › should have 3 links

    TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined

       8 | import FooterStructure from './FooterStructure'
       9 | 
    > 10 | const Footer = () => {
         |                      ^
      11 |     const [footerLinks, error] = useApiCall('http://www.mocky.io/v2/5d7678f93200000362297bae');
      12 |     const [visible, setVisible] = useState();
      13 | 

      at _iterableToArrayLimit (node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js:8:22)
      at _slicedToArray (node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/slicedToArray.js:8:33)
      at Footer (src/global/Footer/index.js:10:22)
      at ReactShallowRenderer.render (node_modules/react-test-renderer/cjs/react-test-renderer-shallow.development.js:794:32)
      at render (node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:636:55)
      at fn (node_modules/enzyme-adapter-utils/src/Utils.js:99:18)
      at Object.render (node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:636:20)
      at new render (node_modules/enzyme/src/ShallowWrapper.js:397:22)
      at shallow (node_modules/enzyme/src/shallow.js:10:10)
      at Object.<anonymous>.beforeEach (src/global/Footer/Footer.test.js:14:15)

  ● Footer links › should have 3 links

    TypeError: Cannot read property 'data' of undefined

      24 | describe('Footer links', () => {
      25 |     it('should have 3 links', () => {
    > 26 |         expect(footerData.data.length).toEqual(3);
         |                           ^
      27 |     });
      28 | });
      29 | 

      at Object.data (src/global/Footer/Footer.test.js:26:27)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.66s, estimated 1s
Ran all test suites related to changed files.

Watch Usage: Press w to show more.```

My jest test with promise
页脚链接
✕ 应该有3个链接(46毫秒)
● 页脚链接›应该有3个链接
TypeError:无法读取未定义的属性“Symbol(Symbol.iterator)”
8 |从“/FooterStructure”导入FooterStructure
9 | 
>10 |常量页脚=()=>{
|                      ^
11 | const[footerLinks,error]=useApiCall('http://www.mocky.io/v2/5d7678f93200000362297bae');
12 | const[visible,setVisible]=useState();
13 | 
at_iterableToArrayLimit(node_modules/babel preet react app/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js:8:22)
在_slicedToArray(node_modules/babel预置react app/node_modules/@babel/runtime/helpers/slicedToArray.js:8:33)
页脚处(src/global/Footer/index.js:10:22)
在reactshallwrender.render(node_modules/react test renderer/cjs/react test renderer shall.development.js:794:32)
渲染时(node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:636:55)
在fn(node_modules/enzyme adapter utils/src/utils.js:99:18)
在Object.render(node_modules/enzyme-adapter-react-16/src/ReactSixteenAdapter.js:636:20)
在新渲染时(node_modules/enzyme/src/shallowRapper.js:397:22)
浅层(node_modules/enzyme/src/shallow.js:10:10)
at Object..beforeach(src/global/Footer/Footer.test.js:14:15)
● 页脚链接›应该有3个链接
TypeError:无法读取未定义的属性“data”
24 |描述('页脚链接',()=>{
25 |它('应该有3个链接',()=>{
>26 | expect(footerData.data.length).toEqual(3);
|                           ^
27 |     });
28 | });
29 | 
在Object.data(src/global/Footer/Footer.test.js:26:27)
测试套件:1个失败,共1个
测试:1次失败,共1次
快照:共0个
时间:0.66s,估计1s
运行与更改的文件相关的所有测试套件。
手表用法:按w键可显示更多信息```
我的玩笑和承诺

将问题限制在一个问题上,而不是一堆一堆地发布,你更有可能得到答案。这是一个问题?问题是我在尝试对自定义钩子使用shallow in jest时遇到此错误。我有一个类似的情况,我的自定义钩子没有引用它正在使用的上下文,并给我“arr[Symbol.iterator]不是一个看似不相关的行中的函数。通过在上下文中包装它来解决。我建议扔掉一个
调试器;
并逐步执行: