2017-10-06 33 views
1

我有這樣的方法來從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();

我試圖傳遞一個TestSchedulerdebounce操作和設置默認計算調度爲TestScheduler通過RxJavaPlugins但結果並沒有改變,測試仍然失敗。

如果測試失敗,那麼這將意味着debounce運算符正在通過它發送事件,忽略它傳遞給它的參數的超時。我不知道這是否正確,但這是我所瞭解的。所以,我的問題是我如何修復這個測試並控制debounce運算符的事件,比如我使用TestSchedulers的源觀察值?

+0

什麼是TestScheduler類? – dazza5000

回答

1

由於第二項發射時發生的onCompleted(),您的測試失敗。該文件說,debounce()將立即發出最後一個項目,它收到onCompleted()

爲了使您的測試工作,要麼連接Observable.never(),要麼將更多項添加到流水線中。

這是一篇關於using debounce的文章,用於完成自動完成。

+0

你說得對,給觀察源添加第三個元素解決了這個問題 – Harry