Невозможно прочитать свойство 'subscribe' неопределенного значения после запуска теста npm (модульное тестирование Angular 2)

Я создал файл тестирования (спецификации) для тестируемого компонента. Но когда я запускаю тест, появляется сообщение об ошибке

Cannot read property 'subscribe' of undefined
TypeError: Cannot read property 'subscribe' of undefined
at ComponentUndertest.ngOnInit

что очевидно, потому что я подписался на что-то в моем методе ngOnInit (), но могу ли я игнорировать подписку во время теста? Или можно при тестировании подделать подписку? Я много гуглил об этой проблеме, но не смог найти ничего, связанного с тестированием angular2. Заранее спасибо.


person Aiguo    schedule 19.10.2016    source источник


Ответы (1)


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

class SomeService {
  getData(): Observable<Data> {}
}

Вы могли бы ....

Создайте шпион 1, в котором вы возвращаете объект с функцией подписки noop.

let mockSomeService = {
  getData: () => {}
}

TestBed.configureTestingModule({
  providers: [
    { provide: SomeService, useValue: mockSomeService }
  ]
})

it('...', () => {
  spyOn(mockSomeService, 'getData').and.returnValue({ subscribe: () => {} })
  // do stuff
  expect(mockSomService.getData).toHaveBeenCalled();
})

Вы могли бы ...

Вернуть фактическое наблюдаемое в шпион

spyOn(mockSomeService, 'getData').and.returnValue(Observable.of(someData))

Возможно, это будет предпочтительнее, чем метод подписки noop, потому что, если вызов службы что-то меняет в компоненте, это то, что вы, вероятно, захотите протестировать.

Вы могли бы ...

Сделайте что-нибудь вроде этого сообщения.


1 - Подробнее о шпионах

person Paul Samsotha    schedule 20.10.2016
comment
Спасибо! тестирование действительно сбивает с толку - person Gerard Simpson; 26.07.2017
comment
Вы также можете переместить действие returnValue в mock: let mockSomeService = {getData: () = ›{return {subscribe: () =› {}}}} - person Krystian; 20.11.2017