0

在我的 Angular 服务中,我有一些代码执行轮询以显示微调器,直到满足特定条件:

@Inject({…})
export class SomeService {
  backendCall(): Observable<SomeStatusWrapper> {
    return this.http.get(…)
  }
  isDocumentReady(): Observable<boolean> {
    const hasFinished = new Subject<boolean>()
    return interval(1000).pipe(
      switchMap(idx => of(idx).pipe(delay(idx*250))), // Increment delay between retries
      switchMap(() => this.backendCall()),
      map(({status}) => status === 'Done'),
      tap(done => done?hasFinished.next(done) : undefined),
      distinctUntilChanged(),
      takeUntil(hasFinished),
      endWith(true)
    )
  }
}

现在,我想为此添加一个单元测试,并且我正在使用 Jasmine 弹珠,但我不确定那里会有多少帧,我无法让单元测试正常工作。

如何用大理石语法表达“间隔”?我知道我们可以做一些事情,比如cold('1000ms (a|)',{a:true})它等待 1000 毫秒,发出“真”并同时完成。

我假设这个测试会通过但它失败了:

it('should emit false after 1000ms', () => {
  const service = TestBed.inject(service) // already mocked backendCall to return a status != 'Done'
  expect(service.isDocumentReady()).toBeObservable(cold('1000ms f', {f: false})) 
})

更简单的版本

我如何编写茉莉弹珠以使此测试通过?

describe('', () => {
  it('should pass', () => {
    const stream$ = interval(1000).pipe(
      switchMap(val => of(val).pipe(delay(250*val))),
      mapTo(false)
    )
    expect(stream$).toBeObservable(cold(???, {f:false}))
  })
})
4

0 回答 0