javascript #angular #unit-testing #jasmine #karma-jasmine
#javascript #угловой #модульное тестирование #jasmine #карма-жасмин
Вопрос:
Я пытаюсь выполнить модульное тестирование метода в моем приложении Angular. Я написал тест, который проходит и проверяет два элемента — глобальная переменная возвращает true и вызывается метод. Я не уверен, что еще я мог бы протестировать здесь, но строка все еще не покрыта.
файл .ts
clickout(event) {
this.isActive = this.eRef.nativeElement.contains(event.target); //not covered!
}
.html-файл
<div (document:click)="clickout($event)" id="clickout" class="actions__container">
click me
</div>
файл .spec
it('should call func and return true', fakeAsync(() => {
component.isActive = true;
fixture.detectChanges();
spyOn(component, 'clickout');
let btn = fixture.debugElement.nativeElement.querySelector('#clickout');
btn.click();
tick();
fixture.detectChanges();
expect(component.clickout).toHaveBeenCalled();
expect(component.isActive).toBe(true);
}));
Как я могу усилить этот тест? Я предполагаю, что это потому, что я не хочу видеть .nativeElement
, содержит ли что-то? Любая помощь приветствуется. Я создал этот пример StackBlitz с установленным jasmine.
Ответ №1:
Классная ссылка на StackBlitz, она может пригодиться.
Причина, по которой он не покрывается, заключается в том, что spyOn(component, 'clickout')
избавляется от деталей реализации clickout
. Как только мы отслеживаем метод, мы говорим stub this method (не вызывайте его, когда он вызывается), но мы получаем доступ к тому, был ли он вызван, с какими аргументами он был вызван и сколько раз он был вызван.
Чтобы получить лучшее из обоих миров, вы должны использовать a, чтобы не потерять детали реализации. .and.callThrough()
spyOn
it('should call func and return true', fakeAsync(() => {
component.isActive = true;
fixture.detectChanges();
// spy on the method and call its actual implementation when it is called
spyOn(component, 'clickout').and.callThrough();
let btn = fixture.debugElement.nativeElement.querySelector('#clickout');
btn.click();
tick();
fixture.detectChanges();
expect(component.clickout).toHaveBeenCalled();
expect(component.isActive).toBe(true);
}));
С .and.callThrough()
помощью, строка, которая не покрыта, теперь должна быть покрыта. При этом это может привести к ошибке nativeElement
или contains
undefined .