Тестирование RxWorker для WorkManager - PullRequest
0 голосов
/ 18 мая 2019

Я хочу впервые попробовать работу менеджера. Я привык к 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>

1 Ответ

2 голосов
/ 18 мая 2019

WorkManager предоставляет несколько способов тестирования ваших Worker классов.Вы можете найти все подробности на странице документации WorkManager Testing .

Оригинал WorkManagerTestInitHelper поддерживает только классы Worker, тем временем, недавно введенный в (WorkManagerv2.1.0-alpha01) TestListenableWorkerBuilder может использоваться для тестирования как ListenableWorker классов, так и других классов, которые из него происходят (например, CoroutineWorker и RxWorker.

InВ вашем конкретном случае вы должны быть в состоянии:

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.work.ListenableWorker.Result
import androidx.work.testing.TestListenableWorkerBuilder
import org.hamcrest.CoreMatchers.`is`
import org.junit.Assert.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4

@RunWith(JUnit4::class)
class MyWorkTest {
    private lateinit var context: Context

    @Before
    fun setup() {
        context = ApplicationProvider.getApplicationContext()
    }

    @Test
    fun testMidiSyncWorker() {
        // Get the ListenableWorker
        val worker = TestListenableWorkerBuilder<MidiSyncWorker>(context).build()

        // Start the work synchronously
        val result = worker.startWork().get()

        assertThat(result, `is`(Result.success()))
    }
}

Таким образом, вы синхронно вызываете свой рабочий класс.

В этом случае вам нужно использовать в качестве тестовой зависимостив вашем build.gradle файле:

def work_version = "2.1.0-alpha02"
androidTestImplementation "androidx.work:work-testing:$work_version"

Вы можете найти аналогичный полный образец (для CoroutineWorker) на сопрограмме Котлина Codelab .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...