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

Jasmine何时重置间谍?为何测试代码需afterEach恢复navigator?

Jasmine间谍重置与navigator手动恢复的疑问解答

先看你提供的测试代码:

describe('Test', function() {
  const NAVIGATOR = window.navigator;

  beforeEach(function() {
    spyOnProperty(window.navigator, 'userAgent').and.returnValue('Mozilla');
  })

  afterEach(function() {
    window.navigator = NAVIGATOR;
  });
}

1. Jasmine何时重置间谍?

  • 针对beforeEach中创建的间谍:Jasmine会在每个测试用例(spec)执行完成后自动重置。重置内容包括清除间谍的调用日志,并且把被间谍替换的函数/属性恢复成原始实现。
  • 针对beforeAll中创建的间谍:框架不会自动重置,因为beforeAll是整个测试套件(describe块)只执行一次,这类间谍需要你手动在afterAll里清理。

2. 为什么还要在afterEach里手动恢复window.navigator?

Jasmine确实会在spec后自动恢复被间谍监听的属性,但这里是特殊情况:

  • window.navigator是浏览器提供的宿主对象,它的属性和普通JS对象的属性行为有差异。有些宿主对象的属性是不可配置、不可枚举的,Jasmine的自动重置机制可能无法完全处理这类特殊属性的恢复,导致下一个测试用例拿到的还是被篡改后的userAgent值。
  • 另外,这段代码是做了防御性处理:如果测试过程中不小心出现了直接覆盖window.navigator整个对象的操作(而非只修改userAgent属性),Jasmine的间谍重置只会处理属性,没法恢复整个对象,这时候手动保存原始的NAVIGATOR并恢复就能避免测试污染。
  • 总结来说,这是针对宿主对象的特殊情况做的稳妥处理,确保测试环境的绝对干净。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:03