无法在 ngOnInit() 中测试订阅

unable to test subscribe in ngOnInit()

我正在使用 Observable 进行事件订阅,但我无法对其进行测试

这是我的代码

服务

export class EventService<T> {
    private eventSubject = new Subject<string>();
    eventSubject$ = this.eventSubject.asObservable();

    dispathEvent(name) {
       this.eventSubject.next(name);
    }
}

组件

export class UserComponent implements OnInit{
    getSub: Subscription;
    constructor(private service EventService, private otherService OtherServece)(){}
    ngOnInt(){
      this.getSub = this.service.eventSubject$.subscribe(name =>{
         this.otherService.performAction();
         this.otherService.setVar = name;
      })

    }
}

规格文件

     let mockEventService :any;
     mockEventService = {
  eventSubject: jasmine.createSpyObj('eventSubject', ['next']),
  eventSubject$: jasmine.createSpyObj('eventSubject$', ['subscribe']),
};
     //some code
     providers: [{ provide: EventService, useValue: mockEventService }]
     // some code
     fixture = TestBed.createComponent(UserComponent);
     component = new TeamOvertimeComponent(mockEventService ,mockOtherService);
     ....
      it('should test ngOnInt Service var status', () => {
        expect(mockEventService.eventSubject$['subscribe']).toHaveBeenCalled()
fixture.detectChanges();
//
component.ngOnInit();
      });

我看到的问题是

TypeError: this.service.eventSubject$.subscribe is not a function

我试着把它们放在每个之前,但问题仍然存在

您需要从具有 subscribe 方法的对象创建一个间谍,在本例中是可观察对象:

mockEventService = {
  eventSubject: jasmine.createSpyObj('eventSubject', ['next']),
  eventSubject$: jasmine.createSpyObj('eventSubject$', ['subscribe']),
};

其余代码你可以保持不变,据我所知。你可以像这样监视它:

expect(mockOvertimeService.eventSubject$['subscribe']).toHaveBeenCalled()

要测试订阅块,您可以这样做(未经测试的代码):

mockEventService = {
  eventSubject$: { subscribe: jasmine.createSpy().and.callFake((cb) => cb('test')) }
};

otherService = {
  performAction: jasmine.createSpy()
};

fixture.detectChanges();

expect(mockEventService.eventSubject$['subscribe']).toHaveBeenCalled();
expect(otherService.performAction).toHaveBeenCalled();
expect(otherService.setVar).toBe('test');