Модуль модульного тестирования в приложении Angular Universal с fakeAsync - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь выполнить юнит-тест службы Resolver в Angular. Одним из моих тестовых примеров является установка значения с помощью TransferState (Server Side Rendering). Я собираюсь сделать это в трубе getHomePageData Observable. Обратите внимание, я издевался над тем, что возвращает этот метод.

Я пытаюсь использовать fakeAsync. Вызывая `flush () '(ранее пробовал tick ()) я ожидал, что он попадет в трубу, но это не так. Что я тут не так делаю?

import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
import { Resolve } from '@angular/router';
import { makeStateKey, TransferState, StateKey } from '@angular/platform-browser';
import { isPlatformServer } from '@angular/common';


import { Observable, of } from 'rxjs';
import { tap } from 'rxjs/operators';


import { ScienceStoryService } from '../../core/science-story/science-story.service';
import { HomePage } from './home-page';


@Injectable()
export class HomePageResolveService implements Resolve<HomePage> {


  constructor(private readonly scienceStoryService: ScienceStoryService,
              @Inject(PLATFORM_ID) private readonly platformId,
              private readonly transferState: TransferState) { }


  resolve(): Observable<HomePage> {
    const HOMEPAGE_DATA_KEY: StateKey<HomePage> = this.getStateKey('homepage-data');


    if (this.transferState.hasKey(HOMEPAGE_DATA_KEY)) {
      const homePageData = this.transferState.get<HomePage>(HOMEPAGE_DATA_KEY, null);
      this.transferState.remove(HOMEPAGE_DATA_KEY);


      return of(homePageData);
    } else {
        return this.scienceStoryService.getHomePageData()
          .pipe(
            tap((homePageData: HomePage) => {
              if (this.isPlatformServer()) {
                this.transferState.set(HOMEPAGE_DATA_KEY, homePageData);
              }
            })
          );
    }
  }


  getStateKey(keyName: string): StateKey<HomePage> {
    return makeStateKey<HomePage>(keyName);
  }


  isPlatformServer(): boolean {
    return isPlatformServer(this.platformId);
  }
}

Юнит тест:

it('should set transfer state while running on server', fakeAsync(() => {
      spyOn(service, 'getStateKey').and.returnValue(makeStateKey<HomePage>('non-existing-key'));
      const scienceStoryService = TestBed.get(ScienceStoryService);
      spyOn(scienceStoryService, 'getHomePageData').and.returnValue(of({}));
      const transferState = TestBed.get(TransferState);
      spyOn(service, 'isPlatformServer').and.returnValue(true);
      spyOn(transferState, 'set');
      service.resolve();
      flush();
      expect(transferState.set).toHaveBeenCalledTimes(1);
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...