Я пытаюсь создать несколько модульных тестов для довольно сложного канала в 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 Это позволяет сэкономить на написании кода для больших макетов на случай, если непонятно, что он делает.