У меня есть этот код:
export class ProgramComponent implements OnInit {
@Input() events: Observable<any>;
eventsSubscription: any;
...
ngOnInit() {
this.eventsSubscription = this.events.subscribe((event) => {
... <- Some code that I want to test!!!!
console.info("The test doesn't get past here!!!!");
});
}
}
describe('BLA BLA BLA', () => {
let component: ProgramComponent;
let fixture: ComponentFixture<ProgramComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
...
],
declarations: [ProgramComponent],
providers: [
...
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ProgramComponent);
component = fixture.componentInstance;
// HERE I WANT TO SPY ON THAT EVENTS OBSERVABLE AND RETURN SOME VALUE
// I tried this without success
spyOn(component, 'events').and.returnValue({type: 'somevalue'}))
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Проблема в том, что приспособление.detectChanges(); не запускает подписку на наблюдаемые события. Должен ли я использовать spyOnProperty? Но это вход компонента...
Спасибо!





Да, вам придется использовать spyOnProperty, так как это свойство, за которым вы пытаетесь следить. Но даже если бы это было не свойство, ваш шпион не возвращает ожидаемый тип для его работы. Возвращаемое значение вашего шпиона — это обычный объект { type: 'somevalue' }, но свойство events ожидает значение типа Observable<any>. Это, скорее всего, приведет к ошибке, поскольку компонент пытается вызвать subscribe для свойства events, но обычный объект не предоставляет этот метод.
Для этого тестового примера я бы просто предоставил фиктивный Observable и проверил, было ли успешно получено значение, которое он излучал, в вашем компоненте (я предполагаю, что вы назначаете то, что получаете от Observable, какому-то свойству в компоненте).
Это может выглядеть примерно так:
beforeEach(() => {
fixture = TestBed.createComponent(DummyComponent);
component = fixture.componentInstance;
});
it('should test the component', () => {
// provide an Observable with whatever value you need in your component
component.events = of({type: 'somevalue'});
// nothing happened yet
expect(component.eventsSubscription).toBeFalsy();
expect(component.valueReceived).toBeUndefined();
// this should trigger change detection and your ngOnInit
fixture.detectChanges();
// verify whatever you need
expect(component.eventsSubscription).toBeTruthy();
expect(component.valueReceived).toEqual({type: 'somevalue'});
});
И в вашем компоненте:
@Input() events: Observable<any>;
eventsSubscription: any;
valueReceived: any;
ngOnInit() {
this.eventsSubscription = this.events.subscribe((event) => {
this.valueReceived = event;
console.info("The test doesn't get past here!!!!");
});
}
Спасибо, очень признателен!