如何在 rxjs 中对 retryWhen 运算符进行单元测试?

Bri*_*ian 3 unit-testing rxjs retrywhen

我正在尝试对自定义 RxJS 运算符进行单元测试。该运算符非常简单,它使用 RetryWhen 重试失败的 HTTP 请求,但有延迟,并且仅当 HTTP Error 在 500 范围内时才会重试。使用 jasmine,这是在 Angular 应用程序中。

我看过这个:

使用 retryWhen 进行 rxjs 单元测试

不幸的是,更新 SpyOn 调用似乎不会更改连续重试时返回的可观察值。每次重试时,都会使用原始间谍值重试。

我还查看了一堆 rxjs 大理石示例,但似乎都不起作用。我不确定这里是否可以使用 rxjs 弹珠,因为(AFAIK)无法模拟首先提交错误的可观察值,然后在后续尝试中提交成功的可观察值的情况。

该代码基本上是此代码的克隆: https: //blog.angularindepth.com/retry-failed-http-requests-in-angular-f5959d486294

export function delayedRetry(delayMS: number, maxRetry) {
    let retries = maxRetry;

    return (src: Observable<any>) =>
        src.pipe(
            retryWhen((errors: Observable<any>) => errors.pipe(
                delay(delayMS),
                mergeMap(error =>
                    (retries-- > 0 && error.status >= 500) ? of(error) : throwError(error))

            ))
        );
}

Run Code Online (Sandbox Code Playgroud)

我希望能够证明它可以订阅一个可观察的对象,该可观察对象在第一次尝试时返回错误,但随后返回成功的响应。最终订阅应该显示 observable 发出的任何成功值。

预先感谢您提供任何见解。

Fan*_*ung 5

尝试使用这个可观察量作为源可观察量来测试

const source = (called,successAt)=>{
  return defer(()=>{
  if(called<successAt){
    called++
  return throwError({status:500})
  }
  else return of(true)
  })
  }
Run Code Online (Sandbox Code Playgroud)

测试

this.delayedRetry(1000,3)(source(0,3)).subscribe()
Run Code Online (Sandbox Code Playgroud)