使用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
相关产品推荐
相关产品推荐

