Как имитировать сервис, чтобы вернуть значение из внутренней службы? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать несколько модульных тестов для довольно сложного канала в Angular. В канал вводятся две службы, одна из которых является базовой службой, которая имеет несколько полей с различными связанными службами в ней, например:

public readonly trackerLocations = new TrackerLocationEntityService('TrackerLocation', this.elementsFactory);

В моем тестовом стенде я имитирую обе службы и использую TestBed.inject ( ), чтобы вернуть шпион.

describe('TrackerLocationPipe', () => {
  let bedSelectorServiceSpy: jasmine.SpyObj<BedSelectorService>;
  let coreEntityServiceSpy: jasmine.SpyObj<CoreEntityService>;
  let pipe: TrackerLocationPipe;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [SpyHelper.provideMagicalMock(CoreEntityService), SpyHelper.provideMagicalMock(BedSelectorService)],
    });

    bedSelectorServiceSpy = TestBed.inject(BedSelectorService) as jasmine.SpyObj<BedSelectorService>;
    coreEntityServiceSpy = TestBed.inject(CoreEntityService) as jasmine.SpyObj<CoreEntityService>;

    pipe = new TrackerLocationPipe(TestBed.inject(CoreEntityService), TestBed.inject(BedSelectorService));
  });
});

Вопрос в том, как я могу высмеять шпион, чтобы вернуть значение, если вызывается метод внутренней службы? Так как:

coreEntityServiceSpy.trackerLocations.getTrackerLocationEntitiesForBedOnWard.and.returnValue(of());

Не будет работать, поскольку свойство «and» не существует во внутреннем методе службы. Причина, по которой я хотел бы сделать это, не вдаваясь в подробности реализации, заключается в том, что pipe полагается на два наблюдаемых для форматирования элемента.

    transform(value: TrackerLocation, admission: boolean, showErrors = true): Observable<string> {
    if (!value) {
      return of('');
    }

    return combineLatest([
      this.bedSelectorService.getBedWithWardAndBay(value.bedId),
      this.entityContext.trackerLocations.getTrackerLocationEntitiesForBedOnWard(value.bedId),
    ]).pipe(
      map(([bed, trackerLocations]) => {
    // ...

SpyHelper.provideMagicalMock () - помощник, найденный в 1013 * Все, что вам нужно знать о макетах в Angular тестах (2020) gist Это позволяет сэкономить на написании кода для больших макетов на случай, если непонятно, что он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...