为何在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
相关产品推荐
相关产品推荐

