Я пытаюсь выполнить юнит-тест службы 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);
}));