Jasmine何时重置间谍?为何测试代码需afterEach恢复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
相关产品推荐
相关产品推荐

