169 похожих чатов

Привет! Подскажите, пожалуйста, как тестируется State из Compose во ViewModel Не

пойму, как проверять последовательность значений.

Пример простой. Пытаюсь проверить через unit тесты, что в stubState последовательно попали значения 10, 2, 3, 17

val stubState: State<Int> get() = _stubState

private _stubState = mutableStateOf(10)

fun stubFun() {
_stubState.value = 2
_stubState.value = 3
_stubState.value = 17
}

То есть как замена StateFlow. Но, что в StateFlow, что в LiveData можно подписаться и проверить отправляемые значения, но как здесь проверить?

25 ответов

35 просмотров

для тестирования флоу насколько я знаю используют библиотеку turbine -> https://github.com/cashapp/turbine

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
для тестирования флоу насколько я знаю используют ...

Для Flow, да, можно турбиной, можно и вручную протестировать. Но как протестировать именно композный State, когда в него подряд несколько значений отправляется. Или турбиной можно и композный State проверить?

Nika Latsabidze
да, можно почему бы и нет

assertEquals(1, turbine1.awaitItem()) assertEquals(2, turbine2.awaitItem()) turbine1.awaitComplete() turbine2.awaitComplete()

Nika Latsabidze
assertEquals(1, turbine1.awaitItem()) assertEq...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
да, можно почему бы и нет

А без турбины если как-то попробовать? Это в какую сторону смотреть? Просто у самого State чего-то, что даёт подписаться на изменения не нашел

без турбины я бы сделал обьертку над флоу и в тесте заюзал бы феиковый класс

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
без турбины я бы сделал обьертку над флоу и в тест...

Ммм... То есть обёртка бы была interface Wrapper<T> { val value: T } Во VM публичное поле вместо State<Int> тогда Wrapper<Int>, а в тесте StateFlow<Int>?

Sergey Kozhukhov
Ммм... То есть обёртка бы была interface Wrapper<T...

interface FlowWrapper { fun putValue(newValue: Int) fun flow(): StateFlow<Int> } class DefaultFlow(private val initial: Int = 0) : FlowWrapper { private val stateFlow = MutableStateFlow(value = 0) override fun flow(): StateFlow<Int> = stateFlow.asStateFlow() override fun putValue(newValue: Int) { stateFlow.value = newValue } }

Nika Latsabidze
interface FlowWrapper { fun putValue(newValue:...

что-то вроде этого. просто с дженериком

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
interface FlowWrapper { fun putValue(newValue:...

Но ведь ViewModel выдает наружу композный State<Int>. Если делать обёртку, которая возвращает StateFlow, то не проще ли сразу StateFlow возвращать из VM вместо композного State. Да и не уж то ради тестов композного State нужно делать приседания с основным кодом...

Sergey Kozhukhov
Но ведь ViewModel выдает наружу композный State<In...

да просто тестировать флоу без турбины я точно уж не знаю. поэтому сделаю обьертку

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
да просто тестировать флоу без турбины я точно уж ...

Без турбины спокойно можно тестировать. Просто приседаний чуть побольше

Sergey Kozhukhov
Без турбины спокойно можно тестировать. Просто при...

ну типо причина турбины это и есть легко тестировать флоу. если ты не хочешь турбины сделай врапперы. это тоже легко

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
да просто тестировать флоу без турбины я точно уж ...

Ну не знаю... FlowWrapper кажется полностью заменять начинает композный State, если правильно понимаю...

Sergey Kozhukhov
Ну не знаю... FlowWrapper кажется полностью заменя...

что ты имеешь в виду компоузный стеит?

Sergey-Kozhukhov Автор вопроса

Обычный State из композа https://developer.android.com/jetpack/compose/state#state-in-composables interface MutableState<T> : State<T>

враппер это просто альтернативное решение проблемы без использывания сторонних либ

Sergey Kozhukhov
Обычный State из композа https://developer.andro...

мм понял. я эту штуку не юзал. но уверен что со стеитфлоу можно добиться тех же результатов что и со mutableStateOf

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
враппер это просто альтернативное решение проблемы...

Просто обычный StateFlow можно протестировать без оберток. Просто поток данных записать в List и после сравнить. И обертки в коде VM не нужны будут

Sergey Kozhukhov
Просто обычный StateFlow можно протестировать без ...

ну у тебя же есть проблема что не можешь просто протестить сразу обычный стеитфлоу в тестах

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
ну у тебя же есть проблема что не можешь просто пр...

Не, у меня сложность, что не понимаю, как тестировать mutableStateOf, он же MutableState, он же State, когда в него идёт поток данных. А с обычными корутиновскими flow все понятно))

Sergey Kozhukhov
Не, у меня сложность, что не понимаю, как тестиров...

лол)) там mutableStateOf. я почему то думал что там mutableStateFlow)

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
лол)) там mutableStateOf. я почему то думал что та...

Бывает) Я тож с этой штукой недавно относительно познакомился)

Sergey-Kozhukhov Автор вопроса
Nika Latsabidze
interface FlowWrapper { fun putValue(newValue:...

@Nikoloz145 но спасибо за идеи большое 👍))

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта