我有一个效果,在一个情况下返回一个EMPTY
Observable。我正试图测试这个案例,但我似乎不知道如何测试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不发出任何东西,而是终止。因此,不会调用成功回调,但会为它触发完整的回调。
如果它适合你的测试,也许你可以检查完整的回调。
请原谅我对测试的理解不足,但这里我无法放入适当的断言语句。所以,我遵循了这种方法,请根据需要调整,更改,唯一的目的是检查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();
});
});
没有测试代码,希望它能工作。