Покрытие углового модульного теста один раз проходит успешно, а в другой раз терпит неудачу

#angular #testing #jasmine #sonarqube #karma-coverage

Вопрос:

Я проводил модульное тестирование покрытия для приложения angular, чтобы увеличить процент покрытия в кубе гидролокатора. Я написал около 200 тестовых примеров для приложения. Когда я запускаю «ng-тест-однократный запуск-cc». Он успешно выполняется для всех тестовых случаев один раз, и некоторые тестовые случаи завершаются с ошибкой «Неперехваченная ошибка: ViewDestroyedError: Попытка использовать уничтоженное представление: обнаружены изменения».

Тестовый случай:

   it('applyFilter() should emit  toolbarStateChange', () => {
    component.initialToolbarState = {
      favouriteFlag: false,
      sort: {
        key: 'TYP',
        dateSortType: 'OPENED.DESC',
        primarySort: 'TITLE',
        sortOrder: 'DESC'
      },
      search: [''],
      filterItems: [''],
      ownedbyFilter: 'test',
      event: 'SORT',
    }
    spyOn(component.toolbarStateChange, 'emit');
    component.applyFilter()
    expect(component.toolbarStateChange.emit).toHaveBeenCalled();
  });
 

Функция в компоненте:

  public applyFilter() {
    this.toolbarState = this.initialToolbarState;
    const selectedFilters: any = [];
    this.currentOwnedBy = (' '   this.selectedOwnedby).slice(1);
    this.toolbarState.filterItems = this.filterItems;
    this.toolbarState.ownedbyFilter = this.selectedOwnedby;
    this.applyDisabled = true;
    this.resetDisabled = false;

    if (this.filterItems amp;amp; this.filterItems.length > 0) {
      this.filterItems.forEach(item => {
        if (item.selected) {
          selectedFilters.push(item.id);
        }
      });
    }
    if (selectedFilters.length == 0 amp;amp; this.OWNEDBY.ANYONE == this.selectedOwnedby) {
      this.resetDisabled = true;
    }

    this.toolbarState.event = {
      action: 'Filter',
      target: this.splitArrayElements(selectedFilters)   ((selectedFilters.length > 0) ? ', Created By ' : 'Created By ')
          this.selectedOwnedby
    };
    this.toolbarStateChange.emit(this.toolbarState);
    this.filterApplied.emit({
      typeFilter: this.filterItems,
      ownedBy: this.selectedOwnedby
    });
    if (this.OWNEDBY.ANYONE !== this.selectedOwnedby) {
      this.filtered = true;
    }
  }
 

Тестовый случай предназначен только для того, чтобы проверить, вызывает ли функция событие вывода.
Я использую здесь Angular 5.

Ответ №1:

Я помню, что у меня тоже была эта проблема в проекте Angular 5, я не уверен, в чем ее причина, но я думаю, что решение состояло в том, чтобы вручную позвонить done в качестве обратного вызова, чтобы сообщить Jasmine, что мы закончили с тестами.

  // add the done callback inside of the paranthesis
 it('applyFilter() should emit  toolbarStateChange', (done: DoneFn) => {
    component.initialToolbarState = {
      favouriteFlag: false,
      sort: {
        key: 'TYP',
        dateSortType: 'OPENED.DESC',
        primarySort: 'TITLE',
        sortOrder: 'DESC'
      },
      search: [''],
      filterItems: [''],
      ownedbyFilter: 'test',
      event: 'SORT',
    }
    spyOn(component.toolbarStateChange, 'emit');
    component.applyFilter()
    expect(component.toolbarStateChange.emit).toHaveBeenCalled();
    // call done to let Jasmine know we are done with this test
    done();
  });
 

Комментарии:

1. Спасибо за ваш ответ, но он периодически выходит из строя.