2017-08-14 7 views
6

I持って、次のRxJava2 Kotlinコード:RxJava Completabe andThenテスト

val tester = Completable.complete() 
      .andThen(SingleSource<Int> { Single.just(42) }) 
      .test()   
tester.assertComplete() 
tester.assertValue(42) 

これは、上のget操作シングル観測可能(画像その後、Completable(APIへの簡単な更新操作を想像)観測可能としたシミュレートAPI)。 Completableが終了するとSingleが実行され、最後にオブザーバ(int 42)でonSuccessイベントが発生するように、2つの観測値を連結したいと考えています。

ただし、このテストコードは機能しません。アサーション次のエラーで失敗します。私は私が間違っているのかを理解することはできませんよ

java.lang.AssertionError: Not completed 
(latch = 1, values = 0, errors = 0, completions = 0)) 

、私は、Completableは、サブスクリプションにonCompleteの発することを期待して、単一のサブスクライブ、そして私の観測者(tester)が取得しますonSuccessイベントの値は42ですが、サブスクリプションは何も表示されずに「一時停止」しているようです。

アイデアは、このブログの記事で見られるものと類似している:

.andThen(SingleSource<Int> { Single.just(42) }) 

あなたが行うSingleSourceを作成します:https://android.jlelse.eu/making-your-rxjava-intentions-clearer-with-single-and-completable-f064d98d53a8

apiClient.updateMyData(myUpdatedData) // a Completable 
    .andThen(performOtherOperation()) // a Single<OtherResult> 
    .subscribe(otherResult -> { 
     // handle otherResult 
    }, throwable -> { 
     // handle error 
    }); 

答えて

8

問題は、中括弧のその曖昧な使用とKotlinですそのSingleObserverに注目していますが、それはKotlinの構文によって隠されています。何が必要なのプレーンを使用することである:私は追加何らかの理由で

.andThen(Single.defer { Single.just(42) }) 
+0

おかげakarnokd

.andThen(Single.just(42)) 

または繰延使用、そのコードに最初に私がやっていたので、 '.andThen {Single.just(42) } 'はコンパイルされませんでした。 – Miquel

関連する問題