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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:40