1

У меня есть образец 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.

+1

это хорошая практика, чтобы поставить условный 'если (this.subscription)' вокруг отписки. Я только что попробовал тестовый код и поставил 'setTimeout' 500 мс на вызов функции ngOnDestroy в вашем тесте, а затем тест прошел. Думаю, это займет некоторое время, пока подписка не будет инициализирована. –

+1

@JacobNotte Это сработало для меня! Только чтобы убедиться, что 'this.subscription' не был' undefined'! – SrAxi

ответ

2

Просто используйте наблюдатель, когда издеваются вашей службы:

{ 
    provide: ActivatedRoute, 
    useValue: { data: Observable.of({ name: 'Stepan' }) } 
} 
+0

Спасибо за ответ, я попробовал '' params: Observable.of ({name: 'Stepan'}) '' вместо '' data: Observable.of ({name: 'Stepan'}) '', теперь его рабочий штраф , – styopdev

1

Необходимо сначала импортировать подписку.

import { Subscription } from 'rxjs/Subscription'; 

 Смежные вопросы

  • Нет связанных вопросов^_^