在单元测试中去抖忽略超时
Debounce ignoring timeout in unit tests
我有这个方法可以从 api
获取搜索结果
public void fetchSearchResults(Observable<String> searchObservable) {
searchObservable
.filter(search -> !TextUtils.isEmpty(search))
.debounce(700, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(search -> getView().showLoader)
.switchMap(search -> apiService.fetchSearchResults(search)) //Api call is executed on an io scheduler
.subscribe(consumer, errorConsumer);
}
我为此方法编写了这个 JUnit 测试:
@Test
public void fetchSearchResultsTest() {
TestScheduler testScheduler = new TestScheduler();
Observable<String> nameObservable = Observable.just("","FA")
.concatMap(search -> Observable.just(search).delay(100,
TimeUnit.MILLISECONDS, testScheduler));
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
}
但是最后一个 verify
语句的测试失败了
org.mockito.exceptions.verification.NeverWantedButInvoked
view.showLoader();
我已经尝试将 TestScheduler
传递给 debounce
运算符并将默认计算调度程序设置为 TestScheduler
到 RxJavaPlugins
但结果没有改变,测试仍然失败。
如果测试失败,则意味着 debounce
运算符正在通过它发送事件,而忽略了参数中传递的超时。我不知道这是否正确,但据我所知。所以,我的问题是如何修复此测试并控制来自 debounce
运算符的事件,就像我使用 TestSchedulers
?
处理可观察源一样
您的测试失败,因为在发出第二个项目时发生 onCompleted()
。文档说 debounce()
将在收到 onCompleted()
.
后立即发布最终项目
要使您的测试正常进行,请连接一个 Observable.never()
,或将更多项目添加到管道中。
这里有一篇关于 using debounce 自动完成的文章。
我有这个方法可以从 api
获取搜索结果public void fetchSearchResults(Observable<String> searchObservable) {
searchObservable
.filter(search -> !TextUtils.isEmpty(search))
.debounce(700, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(search -> getView().showLoader)
.switchMap(search -> apiService.fetchSearchResults(search)) //Api call is executed on an io scheduler
.subscribe(consumer, errorConsumer);
}
我为此方法编写了这个 JUnit 测试:
@Test
public void fetchSearchResultsTest() {
TestScheduler testScheduler = new TestScheduler();
Observable<String> nameObservable = Observable.just("","FA")
.concatMap(search -> Observable.just(search).delay(100,
TimeUnit.MILLISECONDS, testScheduler));
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
}
但是最后一个 verify
语句的测试失败了
org.mockito.exceptions.verification.NeverWantedButInvoked
view.showLoader();
我已经尝试将 TestScheduler
传递给 debounce
运算符并将默认计算调度程序设置为 TestScheduler
到 RxJavaPlugins
但结果没有改变,测试仍然失败。
如果测试失败,则意味着 debounce
运算符正在通过它发送事件,而忽略了参数中传递的超时。我不知道这是否正确,但据我所知。所以,我的问题是如何修复此测试并控制来自 debounce
运算符的事件,就像我使用 TestSchedulers
?
您的测试失败,因为在发出第二个项目时发生 onCompleted()
。文档说 debounce()
将在收到 onCompleted()
.
要使您的测试正常进行,请连接一个 Observable.never()
,或将更多项目添加到管道中。
这里有一篇关于 using debounce 自动完成的文章。