Ожидайте наблюдаемого внутреннего метода в модульном тесте Angular - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующий код:

app.component.specs.ts:

  it('should upload files and add links to array', async () => {
    const files = new TestFileList() as any as FileList;
    component.uploadFiles(files);
    await new Promise((resolve => setTimeout(resolve, 5000)));
    expect(component.photoUrls.length).toEqual(files.length);
  });
}

app.component.ts

uploadFiles(files: FileList) {
    for (let i = 0; i < files.length; i++) {
      this.photoService.uploadPhoto(files.item(i)).subscribe(data => this.photoUrls.push(data.link), error => alert(error));
    }
  }

Обещание тайм-аута в приложении .component.specs.ts не выглядит хорошо. Как мне ждать, пока все файлы будут загружены и ссылки добавлены в массив другим способом?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Это интересно, мне еще не приходилось сталкиваться с такой ситуацией. Но обычно я снова использую служебную функцию под названием waitUntil.

import { interval } from 'rxjs';
.....
export const waitUntil = async (untilTruthy: Function): Promise<boolean> => {
  while (!untilTruthy()) {
    await interval(25).pipe(take(1)).toPromise();
  }
  return Promise.resolve(true);
};

. Вы можете установить время на ваше усмотрение, я просто установил его по умолчанию на 25 мс.

it('should upload files and add links to array', async (done) => {
    const files = new TestFileList() as any as FileList;
    component.uploadFiles(files);
    await waitUntil(() => component.photoUrls.length === files.length);
    // you may not have to do the following assertion because we waited for it to be true
    expect(component.photoUrls.length).toEqual(files.length);
    done();
  });

Таким образом, мы не зависим от времени (setTimeOut of 5s), но мы просто продолжаем цикл до тех пор, пока условие не станет истинным, а затем продолжаем наши утверждения. Я думаю, что это читается лучше.

1 голос
/ 11 марта 2020

Пожалуйста, попробуйте вот так. Дайте мне знать, если это не работает?

 it('should upload files and add links to array' , inject([PhotoService] , fakeAsync((photoService : PhotoService) => {
    const files = new TestFileList() as any as FileList;
    spyOn(photoService ,'uploadPhoto').and.returnValue(of('http://image1.jpeg'));
    component.uploadFiles(files);
    tick(3000);
    expect(component.photoUrls.length).toEqual(files.length);
  })));
...