Angular 2 - 依赖于其他服务的组件中的模拟服务

时间:2016-10-19 02:30:06

标签: unit-testing angular karma-jasmine

如何模拟依赖于组件中其他服务的服务? 请检查以下代码。

a.component.ts

@Component({
  selector: 'my-comp',
  templateUrl: './my.component.html',
  providers: [ MyServiceA ]
})
export class MyComponent {

我服务-a.service.ts

@Injectable()
export class MyServiceA{
  constructor(private myServiceB: MyServiceB) {}

我服务-b.service.ts

export class MyServiceB{
constructor(private myServiceC: MyServiceC,
              private myServiceD: MyServiceD) {}

如何在TestBed配置中的 a.component.spec.ts 中模拟服务?请帮忙。谢谢。

1 个答案:

答案 0 :(得分:4)

你可以随意嘲笑它。其他服务无所谓。我想你可能面临的问题是@Component.providers。使用此功能,您在TestBed中配置的任何模拟都不会被用作@Component.providers优先级,导致Angular尝试创建它,而不是使用模拟。

为了解决这个问题,Angular提供了TestBed.overrideComponent方法,以便我们可以覆盖@Component

的模板和提供程序等内容
beforeEach(() => {
  let myMockService = new MyMockService();

  TestBed.configureTestingModule({
    providers: [
      // the following will not be used
      { provide: MyService, useValue: myMockService }
    ]
  });
  TestBed.overrideComponent(MyComponent, {
    set: {
      providers: [
        // this will override the @Component.providers:[MyService]
        { provide: MyService, useValue: myMockService }
      ]
    }
  });
})