在我的 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}))
})
})