我有一种我想测试的方法看起来像这样:
private Disposable getStuff(){
return Observable
.combineLatest(
repoOne.getStuff(),
repoTwo.getOtherStuff(),
session.getSomethingElse(),
session.getOtherSomethingElse(),
(a, b, c, d) -> new Stuff.Builder()
.stuff(a)
.stuffB(b)
.stuffC(c)
.stuffD(d)
.build())
.throttleLast(500, TimeUnit.MILLISECONDS)
.subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.ui())
.subscribe(this::populateStuff, this::showError);
}
我试图测试这种方法,但它没有通过throttleLast
。我主要通过应用TestScheduler
来尝试它,但没有随时随地使用它。例如,我尝试过:
<...>
.throttleLast(500, TimeUnit.MILLISECONDS,mTestScheduler)
<...>
然后当我打电话给方法时,我提前了:
mCompositeDisposable.add(getStuff());
mTestScheduler.advanceTimeTo(0, TimeUnit.MILLISECONDS);
mTestScheduler.advanceTimeTo(505, TimeUnit.MILLISECONDS);
但这没有任何作用,即populateStuff
或showError
仍未被调用。我可能错误地使用了TestScheduler
,有什么建议吗?
答案 0 :(得分:0)
我仍然不确定为什么这不起作用,所以任何解释肯定会有所帮助。但是,作为修复,我已将throttleLast
替换为sample
:
.sample(500, TimeUnit.MILLISECONDS, true)
从我的理解throttleLast
调用sample
并将emitLast
参数设置为false。从逻辑上讲,我确实想要发射最后一个项目,所以对我而言,改变是有益的。但是,并不确定链在单元测试中的行为如何使用TestScheduler
来跳过任何发射。