RXJS Marble Testing TestScheduler 没有刷新对 Angular Jasmine 单元测试的可观察和错误期望

问题描述 投票:0回答:1

我正在尝试学习如何使用 testScheduler 进行 rxjs 大理石测试。当尝试测试行为主题的 getter 和 setter 时,我得到错误

Expected spy setVersatilityRowOptions to have been called with:[ VersatilityHeaderRowOptions({ onlyShowCertifiedOperators: true, showOffTeamOperators: false })] but it was never called.

这是我的代码的样子

我的服务功能

setVersatilityRowOptions(versatilityRowOptions: VersatilityHeaderRowOptions): void {
  this._versatilityRowOptions.next(versatilityRowOptions);
}

getVersatilityRowOptions(): Observable<VersatilityHeaderRowOptions> {
  return this.$versatilityRowOptions;
}

我正在测试的组件功能

updateVersatility(): void {
  this.versatilityApiService.getVersatilityRowOptions()
    .subscribe(versatilityRowOptions => {
        this.versatilityApiService.setVersatilityRowOptions(versatilityRowOptions);
  });
}

我的测试文件(我也在我的规范文件中模拟了对象、服务和服务函数。此外,该服务已正确注入到我的规范文件中)。

const testScheduler = new TestScheduler((actual, expected) => {
  expect(actual).toEqual(expected);
});

describe('updateVersatility()', () => {
  it('should update behavior subject', () => {
    testScheduler.run(({cold}) => {
      const source1$ = cold('--(x|)', {x: mockVersatilityHeaderRowOptions});  
    spyOn(component['versatilityApiService'],'getVersatilityRowOptions')
      .and.returnValue(source1$);
    spyOn(component['versatilityApiService'], 'setVersatilityRowOptions');

    component.updateVersatility();

    getTestScheduler().flush();

    fixture.detectChanges();

    expect(component['versatilityApiService'].getVersatilityRowOptions)
      .toHaveBeenCalled();
    expect(component['versatilityApiService'].setVersatilityRowOptions)
      .toHaveBeenCalledWith(mockVersatilityHeaderRowOptions);

});

我尝试运行测试调度程序并认为可观察对象会刷新并且我可以期望调用设置器但事实并非如此。

unit-testing rxjs karma-jasmine angular-test rxjs-marbles
1个回答
0
投票

我认为这与我的组件订阅 RxJS 可观察对象的情况类似。我也使用 NgRx Store 并且 observable 来自它,所以我在这里的解决方案可能并不完全适用于你的情况,但希望它适用。

我的解决方案使用来自

TestScheduler.schedule
jasmine-marbles
和来自
fakeAsync
@angular/core/testing

  it('should varify after observables emit', fakeAsync(() => { // <--
    let fixture = TestBed.createComponent(SomeComponent);
    let component = fixture.componentInstance;
    fixture.detectChanges();

    // make the observables in the component emit values

    getTestScheduler().schedule(() => { // <--
      fixture.detectChanges();

      // verify things about the component
      expect(component['someService'].setSomething).toHaveBeenCalled();
    ), time('|')); // <--
  });

希望对你的情况也有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.