Невозможно покрыть услугу в конструкторе угловых юнит-тестов - PullRequest
0 голосов
/ 18 июня 2019

Как я могу решить это?

Привет, я довольно новичок в модульном тесте angular 6 с использованием кармы и жасмина

Я пытаюсь охватить сервис, который находится внутри моего конструктора компонента, но не в состоянии это сделать.Блок it должен создать компонент, охватывающий строки внутри конструктора, за исключением данных, которые возвращаются сервисом.

component.ts

  constructor(public firstService: FirstService, public secondService: SecondService) {

    let localData :any
    let id = this.secondService.getId()
    let initialId = this.secondService.getInitialId()

    this.firstService.getRevisions(id, initialId).subscribe((data) => {
      if (data && data.content) {
         localData = data.content || [];
      }
    });
    }

component.spec.ts

 describe('TestComponent', () => {
      let component: TestComponent;
      let fixture: ComponentFixture<TestComponent>;
      let firstService: FirstService;
      let secondService: SecondService;

     beforeEach(() => {
      TestBed.configureTestingModule({
      declarations: [TestComponent],
      providers: [FirstService, SecondService]
     })
      .compileComponents();
     });
     beforeEach(() => {
     firstService = TestBed.get(FirstService);
     fixture = TestBed.createComponent(TestComponent);
     component = fixture.componentInstance;
     secondService = TestBed.get(SecondService);
     fixture.detectChanges();
     });

    it('should create Component', () => {
    expect(component).toBeTruthy();
    const mockData = {
      "content": [
        {
          "name": "String",
        }
      ],
    }
    spyOn(firstService, "getRevisions").and.callFake(() => {
      return of({ mockData });
    });
    spyOn(secondService, 'getId');
    spyOn(secondService, 'getInitialId');

    fixture.whenStable().then(() => {
      expect(firstService.getRevisions).toHaveBeenCalled();
    });
    });

1 Ответ

0 голосов
/ 18 июня 2019

Вы следите за сервисом после вызова конструктора.

Конструктор вызывается при вызове метода compileComponents() на вашем TestBed.

Итак, у вас есть следующие возможности:

Сначала вы можете создать службу-заглушку, которая уже возвращает определенную наблюдаемую величину, которая выдает значение X. Затем вы предоставите эту заглушку в TestBed с помощью {provide: YourService, useValue: serviceStub}где serviceStub может выглядеть следующим образом: const serviceStub = {yourMethod: ()=> of(YOUR_TEST_VALUE}

Дело в том, что в вашем тестовом примере вы не сможете ожидать, что был вызван сервисный метод, но вы могли бы проверить, что испущенное значение из вашегонаблюдаемый был установлен внутри вашего компонента.Более того, в случае, если вы захотите изменить значение X для разных вариантов использования, вам нужно будет создать несколько описаний, каждое из которых будет иметь свою версию макета сервиса.

Лучшим способом imho было бы перенести подписку в ловушку жизненного цикла onInit.

Для вашего приложения это не будет иметь значения, и его будет проще тестировать.

Жизненный цикл onInit внутри теста вызывается при первом запуске fixture.detectChanges.

Сказав, что, если бы вы переместили подписку в метод ngOnInit, вам нужно всего лишь удалить fixture.detectChanged из функции beforeEach и переместить ее в свой тестовый пример после вашегоspyOn.

...