我正在尝试学习如何使用 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);
});
我尝试运行测试调度程序并认为可观察对象会刷新并且我可以期望调用设置器但事实并非如此。
我认为这与我的组件订阅 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('|')); // <--
});
希望对你的情况也有帮助。