2017-10-06 8 views
1

J'ai cette méthode pour chercher résultat de la recherche de apidélai d'attente en ignorant Debounce dans tests unitaires

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); 
} 

et moi avons écrit ce test JUnit pour cette méthode:

@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(); 
} 

Mais le test échoue le dernier déclaration verify avec le message

org.mockito.exceptions.verification.NeverWantedButInvoked

view.showLoader();

J'ai essayé passer un TestScheduler à l'opérateur debounce et le réglage du planificateur de calcul par défaut comme TestScheduler par RxJavaPlugins mais le résultat ne change pas, le test échoue encore.

Si le test échoue alors cela signifierait que l'opérateur debounce envoie l'événement directement à travers lui en ignorant le délai d'attente passé dans ses arguments. Je ne sais pas si c'est correct mais c'est aussi loin que je comprends. Donc, ma question est comment puis-je réparer ce test et contrôler les événements de l'opérateur debounce comme je le fais avec la source observable avec TestSchedulers?

+0

Où/quoi est la classe TestScheduler? – dazza5000

Répondre

1

Votre test échoue en raison du onCompleted() qui se produit lorsque le second élément est émis. La documentation indique que debounce() émettra l'élément final immédiatement qu'il reçoit onCompleted().

Pour que votre test fonctionne, vous pouvez soit concaténer un Observable.never(), soit ajouter d'autres éléments dans le pipeline.

Voici un article sur using debounce pour effectuer l'auto-complétion.

+0

Vous aviez raison, en ajoutant 3e élément à la source observable résolu le problème – Harry