2017-05-04 15 views
1

Rx-Kotlinで単体テストを行う方法をよりよく理解しようとしていますが、件名を「completed」に設定することができませんでした。その結果、私はいつも5秒のタイムアウトを待っています(onCompleteは即時にすべきです)。そしてassertCompleteで失敗します。Rx-Kotlin awaitTerminalEventは決してonCompleteを受け取りません

awaitTerminalEventの私の理解は、それがonCompleteが呼び出されるまでブロックする必要があるということです。私もTestScheduler,を見てきましたが、私はそれがここで必要とされるべきではないと信じています。

正しい方向に私を導く助けや助けをいただければ幸いです。あなたは間違った方法で間違ったツールを使用している

@Test 
fun testObservable() { 
    val subject = BehaviorSubject.create<Int>() 
    subject.onNext(0) 

    TestSubscriber<Int>().apply { 
     subject.subscribe({ 
      System.out.println(it) 
      subject.onNext(1) 
      subject.onComplete() 
     }) 

     this.awaitTerminalEvent(5, TimeUnit.SECONDS) 
     this.assertComplete() 
     this.assertValue(1) 
    } 
} 

答えて

3

...

  • TestSubscriberは、テストFlowableのために、あなたがここにTestObserver使用すべきです。
  • TestObserver(またはTestSubscriberFlowable)を購読して、排出量を監視し、ターミナルイベントとアサート値を待機できるようにする必要があります。あなたのコードでは、TestSubscriberはストリームには添付されていないので、決してイベントを受け取ることはありません。あなたのコードを模倣しようとしている

、それはこのようなものが考えられます。あなたが見ることができるよう

@Test 
fun testObservable() { 
    val subject = BehaviorSubject.create<Int>() 
    subject.onNext(0) 

    TestObserver<Int>().apply { 
     subject.doOnNext { 
      System.out.println(it) 
      subject.onNext(1) 
      subject.onComplete() 
     } 
       .subscribe(this) 

     this.awaitTerminalEvent(5, TimeUnit.SECONDS) 
     this.assertComplete() 
     this.assertValue(1) 
    } 
} 

、私は、購読がTestObserverオブジェクト、及びサブジェクトonNext()で行われTestObserverを使用していますonComplete()doOnNext()に移動しました。テストでは2つの出力値があるのでテストは失敗し、テストでは単一の '1'値のみがアサートされます。

onNext()で再度発信する件名を使用してからonComplete()に電話をかけた場合は、以前に登録してから外に出すことができます。

TestObserver<Int>().apply { 
     subject.subscribe(this) 
     subject.onNext(1) 
     subject.onComplete() 
     .... 
} 
+0

私はそのような被写体の中に放出すべきではないことを知っています、私はちょうど奇妙なテストを書くことを試みていました。どうもありがとうございます! – sschmitz

関連する問題