У меня есть образец TestComp с методами ngOnInit и ngOnDestroy и подпиской ActivatedRoute.Угловое 2 модульное тестирование «Невозможно прочитать свойство« отписаться »от неопределенного«
@Component({
selector: 'test',
template: '',
})
export class TestComp implements OnInit, OnDestroy {
constructor (
private route: ActivatedRoute
) {
}
ngOnInit() {
this.subscription = this.route.data
.subscribe(data => {
console.log('data', data.name);
})
;
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Я получаю «Не удается прочитать свойство„отказаться от подписки“неопределенных», когда я называю метод ngOnDestroy из спецификации файла (или когда я бегу несколько тестов).
Мой файл спецификации:
describe('TestComp',() => {
let comp: TestComp;
let fixture: ComponentFixture<TestComp>;
beforeEach(async(() => {
TestBed
.configureTestingModule({
declarations: [TestComp],
imports: [RouterTestingModule],
providers: [
{
provide: ActivatedRoute,
useValue: {
data: {
subscribe: (fn: (value: Data) => void) => fn({
name: 'Stepan'
})
}
}
}
// { //Also tried this
// provide: ActivatedRoute,
// useValue: {
// params: Observable.of({name: 'Stepan'})
// }
// }
]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(TestComp);
fixture.detectChanges();
})
}));
it('TestComp successfully initialized',() => {
fixture.componentInstance.ngOnInit();
expect(fixture.componentInstance).toBeDefined()
fixture.componentInstance.ngOnDestroy();
});
});
Я передаю значение ActivatedRoute, основываясь на ответах here, но я получаю сообщение об ошибке. Поэтому мой вопрос: что я должен пройти как ActivatedRoute, чтобы можно было подписаться и отказаться от подписки? Example Plunker.
это хорошая практика, чтобы поставить условный 'если (this.subscription)' вокруг отписки. Я только что попробовал тестовый код и поставил 'setTimeout' 500 мс на вызов функции ngOnDestroy в вашем тесте, а затем тест прошел. Думаю, это займет некоторое время, пока подписка не будет инициализирована. –
@JacobNotte Это сработало для меня! Только чтобы убедиться, что 'this.subscription' не был' undefined'! – SrAxi