2017-05-04 82 views
1

我想更好地瞭解如何使用Rx-Kotlin進行單元測試,但我無法成功設置主題爲「已完成」。因此,我總是等待5秒的時間(onComplete應該是立即的),然後在assertComplete上失敗。Rx-Kotlin awaitTerminalEvent永遠不會完成

我對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的訂閱與TestObserver對象來完成,並且對象onNext()onComplete()轉移到doOnNext()。測試將失敗,因爲您有兩個發射值,而測試僅針對單個「1」值。

一般來說,這是一種錯誤的,你使用主題再次發射在onNext(),然後打電話onComplete(),你可以訂閱之前,然後發射到外面。這樣的事情:

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

我知道我不應該在這樣的主題內發射,我只是想寫一個奇怪的測試。非常感謝! – sschmitz