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

为何在Jest测试中无法为每个用例重新赋值document.cookie?

问题原因分析

你遇到的核心问题是**document.cookie = '' 并不会清除已存在的Cookie**——这是浏览器原生Cookie API的行为,和Jest无关。

浏览器中,设置document.cookie = ''只是尝试添加一个名称为空、值为空的Cookie(如果当前域名/路径允许),但完全不会影响已存在的session Cookie。所以第二个测试里,之前设置的session Cookie依然存在,cookieData()自然还能读取到它。

另外,你在beforeEach里执行document.cookie = ''无效,也是同样的原因:这个操作根本没删除之前的Cookie。

解决方案

要正确清除Cookie,必须遵循浏览器的规则:针对要删除的Cookie,设置相同的路径(path)和域名(domain)(如果设置时指定过),并将expires设为过去的时间,或者max-age=0。

1. 修改单个测试的清除逻辑

把第二个测试里的document.cookie = ''替换为:

document.cookie = 'session=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';

(如果你的Cookie设置了特定路径/域名,需要把path=/改成对应的值,比如path=/app)

2. 全局隔离测试环境(推荐)

在测试文件开头添加beforeEach,确保每个测试执行前清空所有Cookie,避免测试间污染:

beforeEach(() => {
  // 遍历所有Cookie并逐个删除
  document.cookie.split(';').forEach(cookie => {
    const [name] = cookie.trim().split('=');
    document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
  });
});

3. 优化后的完整测试代码

beforeEach(() => {
  document.cookie.split(';').forEach(cookie => {
    const [name] = cookie.trim().split('=');
    document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
  });
});

test('if the browser has a session cookie, then its data will be returned as an object', () => {
  document.cookie =
    'session=%7B%22userId%22%3A8%2C%22expiration%22%3A1660938823%2C%22accessToken%22%3A%22fakeAccessToken%22%2C%22refreshToken%22%3A%22fakeRefreshToken%22%7D';
  const data = cookieData();
  expect(data).toEqual(EXPECTED_STRUCTURE);
});

test('if the browser does not have a session cookie, then undefined will be returned', () => {
  const data = cookieData();
  expect(data).toBe(undefined);
});

const EXPECTED_STRUCTURE = {
  userId: 8,
  expiration: 1660938823,
  accessToken: 'fakeAccessToken',
  refreshToken: 'fakeRefreshToken'
};
额外说明

Jest使用jsdom模拟浏览器环境,其document.cookie的行为和真实浏览器完全一致——所以你遇到的问题本质是对Cookie API的误解,不是测试框架的bug。只要按照浏览器规则操作Cookie,测试就能正常隔离。

内容的提问来源于stack exchange,提问作者Nate Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:36:16