Я исправил тесты, вот как я это сделал.
здесь можно наблюдать две:
1 - Наблюдаемый с interval()
из 1
секунды.
2 - Наблюдаемый ratesUseCase.execute(base)
.
как вы можете видеть ниже, как это внутри MainViewModel
Observable
.interval(1, TimeUnit.SECONDS)
.flatMap { ratesUseCase.execute(base) }
.doOnSubscribe { publishResult(Resource.loading(mapOf())) }
.subscribe(
{
publishResult(Resource.success(values))
},
{
publishResult(Resource.error(it.localizedMessage, mapOf()))
}
)
Для проверки getRates
в MainViewModel
1 - Inject Test расписания для ratesUseCase.execute(base)
2- Используйте RxJavaPlugins.setComputationSchedulerHandler
, чтобы изменить планировщик по умолчанию, как показано ниже
@Before
fun setUp() {
val testScheduler = TestScheduler()
RxJavaPlugins.setComputationSchedulerHandler { testScheduler }
ratesUseCase = RatesUseCase(appSchedulers, currencyRepository)
viewModel = MainViewModel(ratesUseCase)
}
3 - используйте testScheduler.advanceTimeTo
для проверки interval
. Пожалуйста, не порядок здесь важен, как показано ниже:
3.a: Ложный репозиторий
3.b: Соблюдение ViewModel LiveData
3.c: временной интервал продвижения
3.d: Проверить результат
val base = "BASE"
whenever(currencyRepository.getRates(base))
.thenReturn(Observable.just(map))
viewModel.result().observeForever(observer)
viewModel.getRates(base)
testScheduler.advanceTimeTo(1, TimeUnit.SECONDS)
verify(observer).onChanged(
Resource.success(map)
)
Полный проект и тестовые примеры можно найти здесь