问题描述
在一种情况下,我有一个返回 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 才会为真