如何测试返回的Observable是否为EMPTY



我有一个效果,在一个情况下返回一个EMPTYObservable。我正试图测试这个案例,但我似乎不知道如何测试EMPTY可观察的?我的代码如下:

效应:

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()
});

res只有在可观察对象返回空

时才为真

EMPTY不发出任何东西,而是终止。因此,不会调用成功回调,但会为它触发完整的回调。

如果它适合你的测试,也许你可以检查完整的回调。

请原谅我对测试的理解不足,但这里我无法放入适当的断言语句。所以,我遵循了这种方法,请根据需要调整,更改,唯一的目的是检查completecb是否被调用。

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();
});
});

没有测试代码,希望它能工作。

最新更新