角度,服务单元测试。等待可观察的价值

时间:2019-09-08 06:05:17

标签: angular unit-testing rxjs jasmine karma-jasmine

我正在尝试对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);
    }))

1 个答案:

答案 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'

还要注意,我删除了fakeAsynctick,因为两者都不是完成这项工作所必需的。您只需在需要时间的时候使用tick,例如防抖或setTimeout