Jasmine中and.stub与and.callFake的区别及调用问题咨询
搞懂Jasmine中and.stub()和and.callFake()的区别
嘿,作为Jasmine新手碰到这个困惑太正常了!我来给你把这俩方法的区别讲得明明白白,顺便纠正你用法里的小错误~
核心问题:你误用了and.stub()的写法!
首先要敲黑板:and.stub()根本不接受函数参数!你写的spyOn(manager, 'getUsers').and.stub(function () { //to do });是无效的,里面的函数逻辑永远不会被执行——这就是为啥你加调试器没反应的原因!
逐个拆解两个方法
1. and.stub():极简的空替换
and.stub()的作用非常简单:把被spy的方法替换成一个空实现,当这个方法被调用时,只会返回undefined,原方法的逻辑不会执行,也不会执行任何你自定义的代码。
正确用法是这样的:
// 两种写法都可以,效果完全一样 spyOn(manager, 'getUsers').and.stub(); // 或者更简洁的: spyOn(manager, 'getUsers').and.stub;
使用场景:当你只需要让原方法“失效”,不需要模拟任何返回值或逻辑时用它,比如测试某个方法在依赖方法不执行时的表现。
2. and.callFake():自定义假实现的利器
and.callFake()就是专门用来给spy提供自定义假逻辑的方法,你传入的函数会在spy被调用时完全执行——这就是为啥你加调试器会被触发的原因!
正确用法示例:
spyOn(manager, 'getUsers').and.callFake(function () { debugger; // 这里会被触发 return ['Alice', 'Bob']; // 自定义返回值 // 还可以写更复杂的逻辑,比如模拟抛出异常 // throw new Error('获取用户失败'); });
使用场景:当你需要模拟特定的返回值、执行特定逻辑(比如调试、模拟异常、模拟异步操作)时,就用它。
总结二者核心区别
- 参数支持:
and.stub()不接受任何参数;and.callFake()必须传入一个函数作为假实现。 - 执行逻辑:
and.stub()调用时仅返回undefined,无自定义逻辑;and.callFake()会完全执行你传入的函数。 - 适用场景:仅需禁用原方法用
and.stub();需要自定义假逻辑用and.callFake()。
内容的提问来源于stack exchange,提问作者Ankush Jain
相关产品推荐
相关产品推荐

