В настоящее время я использую механизм автозаполнения (упреждающий ввод) ngBootstrap. Теперь я хочу выполнить модульное тестирование, вызывается ли метод для каждой последовательности входного события. Ошибка в моем тестовом примере в настоящее время: Cannot read property 'pipe' of undefined
HTML:
<input id="locationEdit" type="text" class="form-control"
[(ngModel)]="user.location" name="location [ngbTypeahead]="search"/>
Составная часть:
public ngOnInit() {
this.search = (text$: Observable<string>) =>
text$.pipe(
tap(() => {
this.isSearching = true;
this.searchFailed = false;
}),
debounceTime(750),
distinctUntilChanged(),
switchMap(term =>
this.cityService.getLocation(term).pipe(
tap((response) => {
this.searchFailed = response.length === 0;
this.isSearching = false;
})))
);
}
спец.ц
it('should call spy on city search', fakeAsync(() => {
component.user = <User>{uid: 'test', username: 'mleko', location: null, description: null};
const spy = (<jasmine.Spy>cityStub.getLocation).and.returnValue(of['München Bayern']);
fixture.detectChanges();
const compiled: DebugElement = fixture.debugElement.query(By.css('#locationEdit'));
compiled.nativeElement.value = 'München';
compiled.nativeElement.dispatchEvent(new Event('input'));
tick(1000);
fixture.detectChanges();
expect(spy).toHaveBeenCalled();
}));
Может ли кто-нибудь помочь мне правильно издеваться над this.search?
Редактировать
По замечательному предложению @dmcgrandle мне не нужно отображать HTML и имитировать событие ввода, чтобы проверить, работает ли ввод текста. Я скорее должен сделать Observable, который испускает значения и присваивает их функции. Один из подходов:
it('should call spy on city search', fakeAsync(() => {
const spy = (<jasmine.Spy>cityStub.getLocation).and.returnValue(of['München Bayern']);
component.ngOnInit();
const textMock = of(['M', 'Mün', 'München']).pipe(flatMap(index => index));
component.search(textMock);
tick();
expect(spy).toHaveBeenCalled();
}));
Но проблема еще в том, что component.search
не вызывает шпиона. В функции поиска в операторе switchMap
я добавил console.log
, чтобы увидеть, выдается ли значение из функции. Но это не тот случай.
text$.pipe(
поставьте точку отладки или console.log и проверьте какое там значение - person Ntwobike   schedule 21.10.2018spyOn(component, 'search').and.returnValue(of('some string'));
- person HDJEMAI   schedule 21.10.2018