我正在尝试对BehaviorSubject执行简单的单元测试。 看起来像这样:
fit('pageChange', fakeAsync(() => {
spyOn(pagintationService, 'pageChange');
pagintationService.pageChange(3);
expect(pagintationService.pageChange).toHaveBeenCalledWith(3);
tick(100);
pagintationService.page$.subscribe(pageNum => {
console.log(pageNum)
})
}))
当我登录susbscribe()时,我希望该值为3。这是因为实现看起来像这样:
pageChange(page: number) {
this.paginationPageSource.next(page);
}
其中
firstPage = 0;
private paginationPageSource = new BehaviorSubject<number>(this.firstPage);
page$ = this.paginationPageSource.asObservable();
那是为什么?我也尝试过flushMicrotasks(),但是什么也没发生。
更新
fit('pageChange', fakeAsync(() => {
let pageNum = 3;
spyOn(pagintationService, 'pageChange').and.callThrough();
pagintationService.pageChange(pageNum);
pagintationService.page$.subscribe(num =>
expect(num).toBe(pageNum))
expect(pagintationService.pageChange).toHaveBeenCalledWith(3);
}))
答案 0 :(得分:0)
啊,您希望console.log能够启动并打印出3.现在不会,因为您将它传递给了3.之后就可以听观察到了。在这种情况下,您需要先进行更改,然后再进行设置更改,然后它将按照您的预期运行。
以下内容可能会符合您的预期。
it('pageChange', () => {
const pagintationService: TestService = TestBed.get(TestService);
let pageNum: number;
spyOn(pagintationService, 'pageChange').and.callThrough();
pagintationService.page$.subscribe(num => {
console.log(`subscribe sees a ${num}`);
pageNum = num;
});
pagintationService.pageChange(3);
expect(pagintationService.pageChange).toHaveBeenCalledWith(3);
expect(pageNum).toBe(3);
});
这将写出
LOG: 'subscribe sees a 0' // since behavior subject sends current value
LOG: 'subscribe sees a 3'
还要注意,我删除了fakeAsync
和tick
,因为两者都不是完成这项工作所必需的。您只需在需要时间的时候使用tick
,例如防抖或setTimeout
。