You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:44:52