Свойство Жасмин тестовое свойство наблюдается подписка - PullRequest
0 голосов
/ 31 января 2019

У меня есть этот код:

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.log("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();
    });
});

Проблема в том, что fixture.detectChanges ();не вызывает подписку на наблюдаемые события.Должен ли я использовать spyOnProperty?Но это вход компонента ...

Я уже проверяю это и это .

Спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Да, вам придется использовать 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.log("The test doesn't get past here!!!!");
  });
}
...