Jasmine测试中如何正确Mock SupabaseService的get类型session属性调用
错误根源
- 你要mock的
session是类的getter访问器,不是普通实例方法,不能直接用spyOn监听,必须用Jasmine提供的spyOnProperty方法针对getter做监听 - 原代码返回
of(null)属于类型完全不匹配:SupabaseService的sessiongetter返回值是Session | undefined | null的普通值,不是rxjs的Observable类型,不需要用of包裹 - 普通
spyOn无法识别getter属性,所以TS类型推导直接把第二个参数判定为never,就触发了你看到的TS2345报错
正确修改代码
首先调整测试里的spy逻辑,同时注意如果你的测试用例期望isLoggedIn()返回true,需要mock的session值要包含user属性,不能返回null:
describe('LoginService', () => { let service: LoginService; let mockSupabaseService: SupabaseService; beforeEach(() => { TestBed.configureTestingModule({ // 可选优化:提前配置mock服务,避免加载真实SupabaseService依赖 providers: [ LoginService, { provide: SupabaseService, useValue: jasmine.createSpyObj('SupabaseService', [], { session: null }) } ] }); mockSupabaseService = TestBed.inject(SupabaseService); service = TestBed.inject(LoginService); // 核心修改:用spyOnProperty监听getter,第三个参数指定监听get访问器 // 测已登录场景:返回带user的session对象 spyOnProperty(mockSupabaseService, 'session', 'get').and.returnValue({ user: { id: 'test-id', email: 'test@example.com' } } as Session); // 如果要测未登录场景,改成.returnValue(null)即可 }); describe('isLoggedIn()', () => { it('should return true when user has active session', () => { const isLoggedIn = service.isLoggedIn(); expect(isLoggedIn).toEqual(true); }); }); });
补充说明
如果你不需要监听getter的调用次数,只想简单mock属性值,也可以在获取到mock服务实例后直接赋值覆盖:mockSupabaseService['session'] = { user: {} } as Session;
这种写法更简洁,适合不需要校验getter是否被调用的场景。
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

