Я хочу впервые попробовать работу менеджера. Я привык к rxJava, поэтому я решил реализовать свой рабочий менеджер с помощью RxWorker. Но аспект тестирования вызывает у меня головную боль. В основном, менеджер работ проверяет базу данных Firebase, чтобы получить последние изменения к последним изменениям в конкретном документе (это не лучший вариант использования, который я знаю). Но проблема в тесте возвращается, не дожидаясь успеха или сбой. Возвращается, когда менеджер работ еще работает.
Это моя реализация работы менеджера
class MidiSyncWorker(context: Context, params: WorkerParameters) : RxWorker(context, params) {
override fun createWork(): Single<Result> {
return Injection.provideSharePrefsRepo.midiArchiveVersion()
.flatMapObservable { currentVersion ->
Injection.provideOnlineRepo.latestMidiArchive()
.filter { onlineMidi -> onlineMidi.version > currentVersion }
}.firstOrError()
.map { onlineMidi ->
val outputData = Data.Builder()
.putString(KEY_FIREBASE_ARCHIVE_PATH, onlineMidi.url)
Result.success(outputData.build()) }
}
.onErrorReturn { Result.failure() }
}
Это мой тест
fun midiSyncVersionCheck_success_onlineVersionDiffersFromLocalVersion() {
// create request
val request = OneTimeWorkRequestBuilder<MidiSyncWorker>()
.build()
wmRule.workManager.enqueue(request).result.get()
val workInfo = wmRule.workManager.getWorkInfoById(request.id).get(10, TimeUnit.SECONDS)
assertThat(workInfo.state, `is`(WorkInfo.State.SUCCEEDED))
}
Я ожидал, что тест подождет, пока рабочий менеджер вернет успех или неудачу. Но он возвращается, когда менеджер работ еще работает
java.lang.AssertionError:
Expected: is <SUCCEEDED>
but: was <RUNNING>