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

如何在组件测试床上下文外使用ng-mocks创建服务Mock?

解决ng-mocks Mock SubService不生效的问题

问题根源

你的代码漏掉了TestBed初始化的关键环节——MockBuilder只是生成测试模块的配置模板,必须把它传给TestBed完成初始化,否则TestBed.inject拿到的会是SubService的原始实现,而非Mock实例。

正确实现方式

方式一:用MockInstance配置属性

// 先配置MockInstance,要在MockBuilder之前调用
MockInstance(SubService, 'someProperty', () => 10, 'get');

// 生成测试模块配置
const moduleConfig = await MockBuilder()
  .mock(SubService)
  .build();

// 初始化TestBed
TestBed.configureTestingModule(moduleConfig);
await TestBed.compileComponents();

// 现在获取的就是正确Mock的实例
const mockSubService = TestBed.inject(SubService);
expect(mockSubService.someProperty).toBe(10);

方式二:直接在MockBuilder.mock中定义属性

注意如果是getter属性,要写成getter形式,不能直接赋值:

const moduleConfig = await MockBuilder()
  .mock(SubService, {
    get someProperty() { return 10; }
  })
  .build();

TestBed.configureTestingModule(moduleConfig);
await TestBed.compileComponents();

const mockSubService = TestBed.inject(SubService);
expect(mockSubService.someProperty).toBe(10);

额外技巧

  • 给Mock服务设置间谍:拿到Mock实例后,直接用测试框架的spy方法即可:
    // Jasmine示例
    spyOn(mockSubService, 'someMethod').and.returnValue('mockResult');
    // Jest示例
    jest.spyOn(mockSubService, 'someMethod').mockReturnValue('mockResult');
    
  • 不用TestBed的简化写法:如果不需要依赖注入容器,直接用MockService创建实例也能生效:
    MockInstance(SubService, 'someProperty', () => 10, 'get');
    const mockSubService = MockService(SubService);
    // 或直接传配置
    const mockSubService = MockService(SubService, { someProperty: 10 });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:20:01