如何在组件测试床上下文外使用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
相关产品推荐
相关产品推荐

