如何用Jest测试react-cookie的Cookie值?解决迭代器报错
问题原因
这个报错是因为useCookies()钩子在测试环境中没被正确mock,返回了undefined,导致解构数组时失败。
解决方案
正确mock
react-cookie的useCookies钩子
让它返回一个包含初始cookies对象、mock版setCookie和removeCookie的数组,放在测试文件最顶部(import组件之前):jest.mock('react-cookie', () => ({ useCookies: jest.fn(() => [ {}, // 初始空cookies jest.fn(), // mock setCookie jest.fn() // mock removeCookie ]) }));要是你的组件调用
useCookies时传了指定Cookie名称的数组参数,mock里可以根据参数返回对应结构,确保和组件实际调用匹配。在测试用例中验证
setCookie的调用
提取mock的setCookie函数,模拟点击按钮后检查它的调用是否符合预期:import { useCookies } from 'react-cookie'; // 从mock结果里拿setCookie const mockSetCookie = useCookies.mock.results[0].value[1]; // 模拟点击Accept按钮 fireEvent.click(screen.getByText('Accept Cookies')); // 验证调用参数,根据你的实际业务调整 expect(mockSetCookie).toHaveBeenCalledWith('acceptedCookies', true, expect.anything());必要时用
CookiesProvider包裹组件
如果你的组件原本是在CookiesProvider上下文里使用的,测试时也记得用Provider包裹渲染:import { CookiesProvider } from 'react-cookie'; render( <CookiesProvider> <YourCookieBannerComponent /> </CookiesProvider> );要是已经正确mock了
useCookies,这一步可能不需要,但如果mock不生效可以试试。排查mock冲突
检查测试文件里有没有其他地方重复mock了react-cookie,或者jest配置导致mock被覆盖,确保jest.mock的位置在组件import之前。
完整测试示例
import { render, screen, fireEvent } from '@testing-library/react'; import { useCookies } from 'react-cookie'; import CookieBanner from './CookieBanner'; // Mock react-cookie的useCookies钩子 jest.mock('react-cookie', () => ({ useCookies: jest.fn(() => [{}, jest.fn(), jest.fn()]) })); describe('Cookie Banner', () => { test('sets expected cookie when Accept button is clicked', () => { render(<CookieBanner />); // 确认横幅初始状态显示 expect(screen.getByText('Accept Cookies')).toBeInTheDocument(); // 获取mock的setCookie函数 const mockSetCookie = useCookies.mock.results[0].value[1]; // 触发按钮点击 fireEvent.click(screen.getByText('Accept Cookies')); // 验证setCookie的调用参数是否符合业务预期 expect(mockSetCookie).toHaveBeenCalledWith( 'acceptedCookies', true, { path: '/', maxAge: 31536000 } // 示例配置,根据实际情况修改 ); }); });
内容的提问来源于stack exchange,提问作者ReynierPM
相关产品推荐
相关产品推荐

