Angular 2 — Имитирующие сервисы в компонентах, которые зависят от других сервисов

#unit-testing #angular #karma-jasmine

#модульное тестирование #angular #карма-жасмин

Вопрос:

Как мне имитировать сервис, который зависит от другого сервиса, находящегося в компоненте? Пожалуйста, проверьте приведенный ниже код.

a.component.ts

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

my-service-a.service.ts

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

my-service-b.service.ts

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

Как мне имитировать сервис в a.component.spec.ts в конфигурации тестового стенда? Пожалуйста, помогите. Спасибо.

Ответ №1:

Вы можете имитировать это так, как хотите. Другие сервисы не имеют значения. Я думаю, возможно, проблема, с которой вы столкнулись, связана с @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 }
      ]
    }
  });
})