【发布时间】:2018-05-01 12:38:24
【问题描述】:
在 lettable 操作符之前,我做了一个 helper 来修改 debounceTime 方法,所以它使用了一个 TestScheduler:
export function mockDebounceTime(
scheduler: TestScheduler,
overrideTime: number,
): void {
const originalDebounce = Observable.prototype.debounceTime;
spyOn(Observable.prototype, 'debounceTime').and.callFake(function(
time: number,
): void {
return originalDebounce.call(
this,
overrideTime,
scheduler,
);
});
}
所以以下 Observable 的测试很简单:
@Effect()
public filterUpdated$ = this.actions$
.ofType(UPDATE_FILTERS)
.debounceTime(DEFAULT_DEBOUNCE_TIME)
.mergeMap(action => [...])
使用 lettable 操作符,filterUpdated$ Observable 是这样写的:
@Effect()
public filterUpdated$ = this.actions$
.ofType(UPDATE_FILTERS)
.pipe(
debounceTime(DEFAULT_DEBOUNCE_TIME),
mergeMap(action => [...])
);
我不能再修补 debounceTime 运算符了!如何将 testScheduler 传递给 debounceTime 运算符?
【问题讨论】:
-
你可以看看example app form NgRx。在效果中使用 DI 添加调度程序,并在测试时提供不同的调度程序。
-
但是我不太喜欢这种方法,不想将代码添加到仅用于测试的效果中,这种方法意味着在测试效果时使用 TestBed。当我有时间时,我会寻找一些替代品。
-
感谢链接。我们不应该为了测试目的而修改我们的代码:(
-
作为一个get arround,我在我的类中添加了两个方法,所以我可以监视它们。但我不喜欢那个解决方案...
-
回到这个问题,用我发现的东西写下答案,这与@cartan 下面写的非常相似,改变了异步调度程序的工作方式,因为这是 RxJs 默认使用的。不是很好,但这是我发现的唯一不涉及更改效果代码的方法。
标签: typescript rxjs5 ngrx-effects