在Jasmine中测试服务initP方法后buffer属性值的问题
问题分析与修复方案
我来帮你拆解下测试失败的原因,以及对应的修复方法:
1. 间谍(Spy)的默认行为“架空”了原方法
你用spyOn(pService, 'initP')创建了一个方法间谍,但Jasmine的spyOn默认会把原方法替换成一个空实现——也就是说你调用pService.initP()的时候,根本没执行服务里那堆初始化buffer的逻辑,buffer自然还是空数组,断言肯定失败。
如果想保留原方法的功能,同时验证方法是否被调用,需要给间谍加上.and.callThrough(),它会让间谍代理原方法的执行。
2. 断言的目标和比较方式都有问题
- 你写的
expect(buffer).toBe([27, 64])里,buffer没有正确指向服务实例的属性,应该用pService.buffer; - 另外,Jasmine的
toBe是严格引用相等,两个内容相同但引用不同的数组会判定为不相等,数组比较应该用toEqual来检查内容一致性。
修正后的完整测试代码
it('should initialise it', () => { // 保留原方法逻辑的间谍 spyOn(pService, 'initP').and.callThrough(); pService.initP(); // 断言服务的buffer内容正确 expect(pService.buffer).toEqual([27, 64]); // 验证方法确实被调用 expect(pService.initP).toHaveBeenCalled(); });
这样修改后,你的测试就能正常通过啦。
内容的提问来源于stack exchange,提问作者Quang
相关产品推荐
相关产品推荐

