Протестируйте подписку на Location в angular 2 с помощью karma+jasmine (this.location.subscribe)

Я подписываюсь на службу определения местоположения в моем компоненте как таковую:

this.location.subscribe((ev:PopStateEvent) => {
    this.lastPoppedUrl = ev.url;
});

Я хотел бы иметь возможность протестировать его вместе с остальной частью моего компонента.

Прямо сейчас у меня есть эта заглушка в моем файле component.spec.ts

let locationStub: Partial<Location>;
    locationStub = {
}

И я настраиваю его на свой TestBed в качестве провайдера:

{provide: Location, useValue: locationStub }

Когда я запускаю ng test, я получаю эту ошибку this.location.subscribe is not a function.

Как я могу создать заглушку или шпион, который позволит мне передать функциональность .subscribe Location.

Вот аналогичный вопрос о тестировании местоположения, но это относится к функциям в Location, а не к подписке на Location.

Буду признателен за любую оказанную помощь.


person Jackson Vaughan    schedule 30.03.2018    source источник


Ответы (1)


Вы должны сделать это следующим образом:

beforeEach(() => {
    // Mock the location here instead, then pass to the NavBarComponent
    loc = jasmine.createSpyObj("Location", ["back", "subscribe"]);
    Location.subscribe.and.callFake(()=> Observable.of(your stubbed data to return here));
    testNavBarComponent = new NavBarComponent(loc);
});

Поэтому вам нужно добавить subscribe в список доступных функций службы определения местоположения.

И важно сказать, что возвращать потом при вызове подписки,

Для этого предназначен Location.subscribe.and.callFake(()=> Observable.of(Your stubbed data to return here));.

Я попытался создать небольшую демонстрацию:

Вот ссылка на него, можете попробовать форкнуть и доработать как надо.

https://stackblitz.com/edit/angular-testing-c25ezq?file=app/app.component.spec.ts

person HDJEMAI    schedule 30.03.2018