Я не думаю, что вы действительно хотите вызывать любой код ngBootstrap во время вашего теста - в конце концов, вы хотите выполнить модульное тестирование своего кода, а не их.:)
Поэтому я бы посоветовал издеваться над пользователем, фактически набирающим текст, установив собственную Наблюдаемую по времени и вызвав с ней вашу функцию.Возможно издеваться над отправкой персонажа каждые 100 мс.Примерно так:
it('should call spy on city search', fakeAsync(() => {
component.user = <User>{uid: 'test', username: 'mleko', location: null, description: null};
// Change next line depending on implementation of cityStub ...
const spy = spyOn(cityStub, 'getLocation').and.returnValue(of('München Bayern'));
fixture.detectChanges();
let inputTextArray = ['M', 'Mü', 'Mün', 'Münc', 'Münch', 'Münche', 'München'];
let textMock$ : Observable<string> = interval(100).pipe(take(7),map(index => inputTextArray[index]));
component.search(textMock$);
tick(1000);
expect(spy).toHaveBeenCalled();
}));
Обновление:
Я собрал здесь стекаблитц, чтобы проверить это: https://stackblitz.com/edit/stackoverflow-question-52914753 (открыть приложениев левой части папки и нажмите my.component.spec.ts, чтобы увидеть тестовый файл)
После того, как я получил его, стало очевидно, что это не так - на наблюдаемое не было подписки, потому чтоподписка, кажется, осуществляется ngBootstrap, поэтому для тестирования нам нужно явно подписаться.Вот моя новая предложенная спецификация (взята из стекаблита):
it('should call spy on city search', fakeAsync(() => {
const cityStub = TestBed.get(CityService);
const spy = spyOn(cityStub, 'getLocation').and.returnValue(of('München Bayern'));
fixture.detectChanges();
let inputTextArray = ['M', 'Mü', 'Mün', 'Münc', 'Münch', 'Münche', 'München'];
let textMock$ : Observable<string> = interval(100).pipe(take(7),map(index => inputTextArray[index]));
component.search(textMock$).subscribe(result => {
expect(result).toEqual('München Bayern');
});
tick(1000);
expect(spy).toHaveBeenCalled();
}));