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

使用jasmine.createSpyObj构建SpyObj时如何声明getter属性?

关于用Jasmine.createSpyObj模拟类getter属性的问题

直接把getter属性名放进createSpyObj的方法名数组里当作方法声明是不可行的——这么做只会创建一个普通的方法Spy,而不是模拟getter的访问行为。不过别担心,我们有正确的方式来实现你想要的功能,下面就来一步步说明:

正确实现方式1:使用createSpyObj的第三个参数定义getter

Jasmine的createSpyObj支持第三个参数,专门用来定义属性(包括getter)的初始值或Spy。你可以在这个参数里直接指定getter的模拟值,之后还能通过spyOnProperty修改它:

// 你的真实类
class MyRealClass {
  get myGetter() {
    return 'original value';
  }

  someMethod() {
    // 原方法逻辑
  }
}

// 创建包含方法和getter的Spy对象
const mySpy = jasmine.createSpyObj<MyRealClass>(
  'MyRealClass',
  ['someMethod'], // 这里放真实类的方法名
  { myGetter: 'mocked getter value' } // 这里放getter的初始模拟值
);

// 测试过程中可以随时修改getter的返回值
spyOnProperty(mySpy, 'myGetter').and.returnValue('updated mock value');

// 验证行为
expect(mySpy.myGetter).toBe('updated mock value');
expect(mySpy.someMethod).toHaveBeenCalled(); // 如果调用过的话

正确实现方式2:手动添加getter Spy(更灵活)

如果需要对getter的Spy做更精细的控制(比如自定义get逻辑),可以用Object.defineProperty结合Jasmine的createSpy来手动添加:

const mySpy = jasmine.createSpyObj<MyRealClass>('MyRealClass', ['someMethod']);

// 给Spy对象添加getter Spy
Object.defineProperty(mySpy, 'myGetter', {
  get: jasmine.createSpy('myGetterSpy').and.returnValue('initial mock'),
  configurable: true // 允许后续修改这个属性
});

// 后续修改返回值
(mySpy.myGetter as jasmine.Spy).and.returnValue('new mock value');

// 验证getter被访问过
expect(mySpy.myGetter).toBe('new mock value');
expect((mySpy.myGetter as jasmine.Spy)).toHaveBeenCalled();

为什么不能直接把getter放进方法名数组?

当你把getter属性名(比如myGetter)放进createSpyObj的第二个参数(方法名数组)时,Jasmine会给Spy对象添加一个同名的方法(比如mySpy.myGetter()),而不是模拟getter的访问行为(mySpy.myGetter)。这和你真实类中getter的使用方式完全不符,自然达不到预期的测试效果。

内容的提问来源于stack exchange,提问作者vince

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:26