RxJava 2. Проверьте порядок вызовов TestObserver - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть две наблюдаемые в моем API ( модель представления может показать основную идею, это только пример ):

interface ViewModel {
    val height: Observable<Int>
    val color: Observable<Int>

    fun refresh()
}

Как я могу проверить порядок вызова TestObserver вмодульный тест:

@Test
fun `When vm refresh, then color should be applied and then height`() {
    val heightObserver = vm.height.test()
    val colorObserver = vm.color.test()

    vm.refresh()

    // how to verify colorObserver value should be delivered first?
}

В общем случае нам не следует полагаться на порядок, но, однако, вопрос: есть ли у нас способ проверить порядок и как?

1 Ответ

0 голосов
/ 06 ноября 2019

Я предлагаю использовать оператор merge . Например, эти наблюдаемые реализуются как ReplaySubject (необязательно, может быть любой другой):

class ViewModelImpl : ViewModel {
    private val colorSubject = ReplaySubject.create<Int>()
    private val heightSubject = ReplaySubject.create<Int>()

    override val height: Observable<Int> = heightSubject
    override val color: Observable<Int> = colorSubject

    override fun refresh() {
        colorSubject.onNext(1)
        colorSubject.onNext(2)
        colorSubject.onNext(3)

        heightSubject.onNext(4)
        heightSubject.onNext(5)
        heightSubject.onNext(6)
    }
}

Для такой реализации этот тест завершится успешно:

@Test
fun refresh() {
    val vm: ViewModel = ViewModelImpl()
    vm.refresh()
    Observable.merge(vm.color, vm.height)
            .test()
            .assertValues(1, 2, 3, 4, 5, 6)
}

И этот тест выполняется с ошибкой:

@Test
fun name() {
    val vm: ViewModel = ViewModelImpl()
    vm.refresh()
    Observable.merge(vm.color, vm.height)
            .test()
            .assertValues(4, 5, 6, 1, 2, 3)
}
...