我有一个效果,在一种情况下返回一个
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
,我就可以让它工作。但我真的很想知道如何测试这个案例。
我们在 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
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();
});
});
尚未测试代码,希望它有效。
isEmpty
与 lastValueFrom
组合成一行来完成空性测试:
it('should return EMPTY when ...', async () => {
expect(await lastValueFrom(effects.effect$.pipe(isEmpty())).toBeTruthy();
})
这避免了任何回调函数,如
done
和 setTimeout
。