Jasmine中callThrough、callFake、return value类spies用法疑问
Jasmine 三类Spy行为配置的用法与区别
Spy是Jasmine中用于模拟、监听目标函数的核心测试工具,你提到的三种配置是指定Spy被调用时的不同行为,具体说明如下:
1. callThrough:调用原函数
- 核心行为:Spy不会拦截原函数的执行,调用Spy时会完整运行原函数的逻辑,同时Spy会自动记录所有调用的参数、返回值、调用次数等信息
- 适用场景:既需要拿到原函数的真实执行结果,又需要验证函数调用行为(是否被调用、传入参数是否符合预期)的场景
- 用法示例:
// 原对象与方法 const user = { getName: function() { return "Lilit" } } // 给getName方法创建Spy并配置callThrough spyOn(user, "getName").and.callThrough() const result = user.getName() // 此时result等于原函数返回的"Lilit",同时Spy记录了本次调用 expect(user.getName).toHaveBeenCalled() // 断言通过 expect(result).toBe("Lilit") // 断言通过
2. returnValue:固定返回指定值
- 核心行为:Spy完全拦截原函数的执行,原函数逻辑不会运行,只要调用Spy就直接返回提前指定的固定值,同时记录调用信息
- 适用场景:不需要原函数执行,仅需要模拟函数返回值支撑下游逻辑测试的场景,比如原函数是后端接口请求方法,不需要真实发请求,直接模拟返回固定接口数据即可
- 用法示例:
const user = { getName: function() { // 此处原函数逻辑完全不会执行 console.log("原函数执行了") return "Lilit" } } spyOn(user, "getName").and.returnValue("模拟姓名") const result = user.getName() // 控制台不会打印"原函数执行了",result等于指定的"模拟姓名" expect(result).toBe("模拟姓名") // 断言通过
3. callFake:执行自定义模拟函数
- 核心行为:Spy完全拦截原函数的执行,转而执行你传入的自定义函数,返回值为自定义函数的返回值,同时记录调用信息
- 适用场景:需要的返回值不是固定值,或者需要根据调用参数动态返回结果、执行自定义逻辑的场景,灵活度远高于
returnValue - 用法示例:
const user = { getName: function(id) { return "原名称" } } // 自定义逻辑:根据传入的id返回不同的名称 spyOn(user, "getName").and.callFake(function(id) { if(id === 1) return "管理员" if(id === 2) return "普通用户" return "访客" }) const result1 = user.getName(1) const result2 = user.getName(3) expect(result1).toBe("管理员") // 断言通过 expect(result2).toBe("访客") // 断言通过
三者核心区别总结
- 仅
callThrough会执行原函数逻辑,returnValue和callFake都会完全拦截原函数的执行 returnValue仅支持返回固定值,灵活度最低,配置最简单callFake支持自定义任意逻辑,可根据参数动态返回结果,灵活度最高- 验证原函数本身逻辑同时需要监听调用情况选
callThrough,仅需要固定返回值选returnValue,需要复杂模拟逻辑选callFake
内容的提问来源于stack exchange,提问作者Lilit Mazmanyan
相关产品推荐
相关产品推荐

