2017-08-01 2 views
0

So beginnen bei ein wenig Kontext über das, was ich achive wollen:Wie kann ich keine Daten von Flowable für Komponententests emmittieren?

Ich habe Funktion in DataManager Klasse mit dem Namen getBusRoutesByQuery(query: String) die Flowable<List<Route>> zurückgibt. Diese Funktion sucht im lokalen und Remote-Speicher nach Busrouten nach der angegebenen Abfrage. Ich verwende zip, um zwei Flowables zu kombinieren und sie zu einem ohne Duplikate zusammenzufügen. Aber wenn der Benutzer zum ersten Mal die App benutzt, hat er keine Daten in der lokalen Quelle, so dass zip nicht funktioniert. Also habe ich eine Funktion gefunden onErrorReturn und ich benutze es, wenn es keine Daten zurückgeben wird. onErrorReturn gibt leere Liste statt Fehler zurück, so dass die entfernte Quelle zip mit leeren Daten ist. Und jetzt, wenn ich im Test Flowble.empty() verwende, um Situation zu summieren, wo es keine Daten im lokalen Speicher gibt, wird der Test nicht bestanden.

-Test Annahmen:

  1. keine Daten im lokalen Speicher
  2. verfügbaren Daten in Remote-Speicher
  3. getBusRoutesByQuery(query: String) von DataManager
  4. Daten aufgerufen wird, wird

Jetzt retriven wie es sieht im Code aus:

override fun getBusRoutesByQuery(query: String): Flowable<List<Route>> { 
    val networkSourceWithSave: Flowable<List<Route>> = remoteBusDataManager 
      .getBusRoutesByQuery(query) 
      .doOnNext { localBusDataManager.insertBusRoutes(it) } 
      .onErrorReturn { listOf() } 
    val localSource: Flowable<List<Route>> = localBusDataManager 
      .getBusRoutesByQuery(query) 
      .onErrorReturn { listOf() } 

    return Flowable.zip(localSource, 
         networkSourceWithSave, 
         BiFunction { local, remote -> mergeTwoListsWithoutDuplicates(local, remote) }) 
} 

und der Test:

@Test 
fun getRoutesByQueryWhenLocalSourceIsNotAvailable() { 
    `when`(localBusDataManager.getBusRoutesByQuery(QUERY)).thenReturn(Flowable.empty()) 
    `when`(remoteBusDataManager.getBusRoutesByQuery(QUERY)).thenReturn(Flowable.just(ROUTES)) 

    busDataManager.getBusRoutesByQuery(QUERY).subscribe(testSubscriber) 

    testSubscriber.assertValue(ROUTES) 
} 

Also sagen Sie mir, was kann ich mit zip tun, wenn die lokale Speicherung Daten nicht verfügbar ist, und wie kann ich es testen. Danke;)

Antwort

1

Ihre Implementierung ist falsch. Zip wird in jedem Stream 1: 1 kombiniert, siehe Dokumentation: http://reactivex.io/documentation/operators/zip.html. Da einer deiner Streams leer ist, gibt es nichts zu komprimieren und nichts wird stromabwärts geschoben.

Statt zippen Ich würde vorschlagen, merge und deutlich: localSource.mergeWith(networkSourceWithSave).distinct()

+0

Dank, jetzt ist es funktioniert;) – Panczur

Verwandte Themen