Как в Angular протестировать функцию из forwardRef
Angular это популярный JavaScript фреймворк, который используют многие веб разработчики, наряду с React
и Vue
. При создании приложений на нем (как и на любом другом) очень важно покрывать код юнит тестами. Во многих командах разработчиков есть стандарт по минимальному проценту покрытия кода тестами.
Рассмотрим гипотетическую ситуацию, когда может потребоваться покрыть тестами функцию-аргумент для forwardRef
при имплементации интерфейса ControlValueAccessor
. Предположим, что вы фриланс веб разработчик, пишете на Angular и попали на проект в компанию или команду, где есть очень жесткий минимальный стандарт по тестам в 90%
.
У вас есть очень простой компонент, который имплементирует интерфейс ControlValueAccessor
. В декораторе компонента должна быть приблизительно такая строчка:
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NameOfTheComponent) }]
Класс этого компонента настолько простой, что содержит всего пару методов. Другими словами, вы не сможете достичь 90%
покрытия по функциям если не покроете еще ту которая передается в forwardRef
.
Чтобы покрытие по функциям охватывал и forwardRef
, нужно всего лишь инжектировать провайдер NG_VALUE_ACCESSOR
в ваши тесты. Это можно сделать, например так:
beforeEach(() => {
fixture = TestBed.createComponent(NameOfTheComponent);
component = fixture.componentInstance;
fixture.debugElement.injector.get(NG_VALUE_ACCESSOR);
fixture.detectChanges();
});
В этом случае code coverage по функциям в тестах сразу позеленеют, но следует отметить, что такой код едва ли что-то тестирует, его полезность исключительно искусственная, чтобы помощь вам формально преодолеть минимальный порог.