#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. Спасибо за ваш ответ, но он периодически выходит из строя.