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

Jasmine测试中如何正确Mock SupabaseService的get类型session属性调用

错误根源
  • 你要mock的session是类的getter访问器,不是普通实例方法,不能直接用spyOn监听,必须用Jasmine提供的spyOnProperty方法针对getter做监听
  • 原代码返回of(null)属于类型完全不匹配:SupabaseService的session getter返回值是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 22:15:02