如何测试返回的Observable是否为EMPTY

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

我有一个效果,在一种情况下返回一个

EMPTY
Observable。我正在尝试测试这个案例,但我似乎不知道如何测试
EMPTY
Observable? 我的代码如下:

效果:

   effect$ = createEffect(() =>
    this.actions$.pipe(
      ofType(someAction),
      mergeMap(([action]) => {
        if (someCondition) {
          return EMPTY <-- this is what I am trying to test
        }
        return someServiceCall.pipe(
          map((offers) => //dispatch some action,
          catchError((error: string) => // dispatch another action),
        )
      }),
    ),
  )

这是我的单元测试尝试,但失败了

Error: Timeout - Async function did not complete within 5000ms (set by jasmine.DEFAULT_TIMEOUT_INTERVAL)
.

考虑到测试中已经满足条件:

  it('should return EMPTY when ...', (done) => {
    actions$ = of(someAction)
    effects.effect$.subscribe((res) => {
      expect(res).toEqual(never)
      done()
    })
  })

如果回报是

of(null)
而不是
EMPTY
,我就可以让它工作。但我真的很想知道如何测试这个案例。

angular rxjs jasmine karma-jasmine ngrx-effects
3个回答
10
投票

我们在 RxJs 中似乎有一个特定的操作来检查可观察量是否为空。操作是

isEmpty()

it('should return EMPTY when ...', (done) => {
    actions$ = of(someAction)
    effects.effect$.pipe(isEmpty()).subscribe( (res) => {
                                               expect(res).toEqual(true)
                                               done()
                                              });

仅当 observable 确实返回空时,res 才会为 true


2
投票

EMPTY 不发出任何东西,但终止。因此,不会调用成功回调,但会触发完整回调。

如果适合您的测试,也许您可以查看完整的回调。

请原谅我对测试的了解较少,但在这里我无法放置适当的断言语句。所以,我遵循了这种方法,请根据需要调整、更改,唯一的目的是检查

complete
cb 是否被调用。

 it('should return EMPTY when ...', (done) => {
    actions$ = of(someAction)
    const success = () => {};
    const error = () => {};
    const complete = () => {};

    effects.getShopOffersInTimeRange$.subscribe(success, error, complete);

    setTimeout(() => {
      expect(complete).toHaveBeenCalled();
      done();
    });
  });

尚未测试代码,希望它有效。


0
投票

可以通过将

isEmpty
lastValueFrom
组合成一行来完成空性测试:

it('should return EMPTY when ...', async () => {
    expect(await lastValueFrom(effects.effect$.pipe(isEmpty())).toBeTruthy();
})

这避免了任何回调函数,如

done
setTimeout

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