微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在一种情况下,我有一个返回 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,我可以让它工作。但我真的很想知道如何测试这个案例。

解决方法

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();
    });
  });

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

,

似乎我们在 RxJs 中有一个特定的操作来检查 observable 是否为空。操作是isEmpty()

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

仅当 observable 返回空值时 res 才会为真

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。