Тестовый набор Angular и Jasmine - не удается прочитать свойство 'includes' из неопределенного - PullRequest
1 голос
/ 09 марта 2019

Я создаю приложение Ionic 4 + Angular 7. В приложении у меня есть страница видео, на которой я получаю URL-адреса видео из API бэкэнда через сервисы инъекций. Вызов со страницы в videoService обрабатывается в асинхронной функции fetchVideoData ()

async fetchVideoData() {
    await this.videoService.getVideos().subscribe(data => {
        this.videoData = JSON.parse(JSON.stringify(data));
        const videoDataArrayLength = this.videoData.videosURLs.length;
        const videoArray = [];
        const videoUrlsArray = [];
        for (let i = 0; i < videoDataArrayLength; i++) {
            videoArray.push(this.videoData.videosURLs[i]);
            videoUrlsArray.push(this.videoData.videosURLs[i]['videoUrl']);
            if (this.videoData.videosURLs[i]['id'] === this.videoIdFromGameDetailPage) {
                this.arrayIterator = Number(this.videoData.videosURLs[i]['id']);
                this.arrayIterator--;
                this.videoUrlFetched = this.videoData.videosURLs[this.arrayIterator]['videoUrl'];
            }
        }
        this.isUrlYoutube = this.videoUrlFetched.includes(this.substring);
    });
}

эта функция вызывается в ngOnInit ()

ngOnInit() {
    this.activatedRoute.params.subscribe(data => {
        this.videoIdFromGameDetailPage = data['vid'];
    });
    this.fetchVideoData().then(() => {
        this.isDataFromVideoApiReady = true;
    });
}

Все это работает нормально. Проблема в тестовом примере этого fetchVideoData () асинхронный метод

Вот тестовый пример для этого метода -

it('should get video data from observable', fakeAsync(() => {
    let arrayIteratorStub: number;
    let videoUrlFetchedStub: string;
    spy = spyOn(videoService, 'getVideos').and.returnValue(of(videoDataStub));
    component.ngOnInit();
    tick();
    component.fetchVideoData().then((result) => {
        expect(videoService.getVideos).toHaveBeenCalled();
        expect(component.videoData).toBe(videoDataStub);
        for (let i = 0; i < videoDataStub.videosURLs.length; i++) {
            expect(videoDataStub.videosURLs[i]['id']).toEqual(ActivatedRouteSpy.params['vid']);
            arrayIteratorStub = Number(videoDataStub.videosURLs[i]['id']);
            arrayIteratorStub--;
            videoUrlFetchedStub = videoDataStub.videosURLs[arrayIteratorStub]['videoUrl'];
        }
        isUrlYouTubeStub = videoUrlFetchedStub.includes('youtube');
        expect(component.isUrlYoutube).toEqual(isUrlYouTubeStub);
    });
}));

Во время выполнения теста я получаю это - TypeError: Невозможно прочитать свойство 'includes' из неопределенного

И я застрял в этом. Я понятия не имею, почему он возвращает эту ошибку. Я перепробовал все, что знаю. Кто-нибудь может мне с этим помочь? Я новичок в Angular и Ionic так много раз, что не знаю, что делаю?

...