Unit testing RxJS Redux可观测测试在epic中进行重试
我正在努力研究如何在Unit testing RxJS Redux可观测测试在epic中进行重试,unit-testing,rxjs,rxjs5,redux-observable,Unit Testing,Rxjs,Rxjs5,Redux Observable,我正在努力研究如何在redux可观测epic中测试retryWhen操作符。根据从中获取的信息,我在尝试测试响应失败2次之后返回有效响应的情况下进行了分叉 下面是代码的一些部分。对于整个实现,请使用 如果您在jsbin中检查响应,那么实际操作总是在空数组中进行。我遇到了一个类似的问题,当时我正在尝试测试一个角度HttpInterceptor,它在两次尝试之间有一个延迟,最多尝试三次。正如您在评论中提到的,retryWhen会在每次出错后重新订阅observable。这意味着,如果您有一个可观察到
redux可观测epic
中测试retryWhen
操作符。根据从中获取的信息,我在尝试测试响应失败2次之后返回有效响应的情况下进行了分叉
下面是代码的一些部分。对于整个实现,请使用
如果您在jsbin中检查响应,那么实际操作总是在
空数组中进行。我遇到了一个类似的问题,当时我正在尝试测试一个角度HttpInterceptor,它在两次尝试之间有一个延迟,最多尝试三次。正如您在评论中提到的,retryWhen会在每次出错后重新订阅observable。这意味着,如果您有一个可观察到的错误(例如,cold(“#|”)
),那么当is重新订阅每次重试时可观察到的相同错误时,您将始终在retryWhen中得到一个错误
这看起来像一个黑客,但我创建了这个简单的类,它按照给定的顺序订阅不同的观测值
class MultiObservable extends Observable<any> {
constructor(observables: Observable<any>[]) {
let subscriptionIdx = 0;
super((subscriber: Subscriber<any>) =>
observables[subscriptionIdx++].subscribe(subscriber));
}
}
我希望其他人能有一个不那么老套的解决方案,但这对我来说现在起作用了。你好!你有没有试过测试你的retryWhen,而没有其他的东西和所有的抽象?有人可能很难帮助你,因为我或他们需要花费大量的时间来理解一切。@jayphelps谢谢你的快速回复。问题似乎在于,当使用retry
或retryWhen
从一开始就重试整个操作时,而不仅仅是重试内部ajax可观察对象(在switchMap内部)。我根据上面的例子做了很多测试,您可以看到,如果您尝试更改重试次数(.retry(3)
)或更改响应大理石(response:['-#a |'
),您可以看到实际帧是帧和重试次数的乘积。
class MultiObservable extends Observable<any> {
constructor(observables: Observable<any>[]) {
let subscriptionIdx = 0;
super((subscriber: Subscriber<any>) =>
observables[subscriptionIdx++].subscribe(subscriber));
}
}
const testObservable = new MultiObservable([
cold('#|', null, { status: 400 }),
cold('a|')
]);
next.handle.and.returnValue(testObservable);
const actual = interceptor.intercept(req, next);
expect(actual).toBeObservable(cold('---a|'));