2017-12-11 7 views
2

통화를 목록으로 표시하는 간단한보기가 있습니다. 앱은 1 초마다 웹 서비스에서 통화를 가져옵니다. 그래서 난 내 뷰 모델에 방법을 다음 있습니다 :RxJava 무한 간격 테스트

fun onViewAppeared() { 
    currenciesViewStateUpdates.onNext(CurrenciesViewState(true, null)) 
    Flowable.interval(1, TimeUnit.SECONDS) 
    .flatMapSingle { _ -> currenciesService.calculateCurrencies(Currency("EUR", 10.0)) } 
    .doOnError { error -> Log.d("LOG", error.message) } 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe { currencies -> 
     currenciesViewStateUpdates.onNext(CurrenciesViewState(false, currencies)) 
    } 
} 

지금 내가 단위 테스트에이 동작이 필요합니다 즉각적인 위해 설정

@Test 
fun viewAppearedAndCurrenciesRequestSucceeded_currenciesDisplayed() { 
    val currencies = listOf(Currency("", 0.0)) 
    Mockito.`when`(currenciesServiceMock.calculateCurrencies(anyCurrency())).thenReturn(Single.just(currencies)) 
    viewModel.getViewStateUpdates().subscribe(testObserver) 

    viewModel.onViewAppeared() 

    testObserver.assertSubscribed() 
    testObserver.assertNoErrors() 
    testObserver.assertValueCount(2) 
    assertFalse(testObserver.values()[1].loading) 
    assertNotNull(testObserver.values()[1].currencies) 
    testObserver.values()[1].currencies?.let { assertTrue(it.isNotEmpty()) } 
} 

모든 RxSchedulers은. 문제 : 관찰을 통해 관찰 가능한 구독이 끝날 때까지 영원히 기다리고 있지만 무한 간격이므로 끝내지 않습니다. 어떻게 테스트 할 수 있습니까?

답변

0

여러분이 만든 방식대로 테스트를 실행하는 데 문제가 있습니다.

  1. 테스트 및 프로덕션 중에 적절한 방식으로 스케줄러를 주입 할 수 있도록 스케줄러를 클래스 매개 변수로 만드십시오.
  2. 교착 상태가 발생할 수 있으므로 Schedulers.immediate() 대신 테스트 스케줄러를 사용하십시오.
  3. 시간 초과 작업 (interval(), timeout() 등)은 명시 적 스케줄러 (보통 사용자가 주입 한 스케줄러)에서 작동합니다.