пойму, как проверять последовательность значений.
Пример простой. Пытаюсь проверить через 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 можно подписаться и проверить отправляемые значения, но как здесь проверить?
для тестирования флоу насколько я знаю используют библиотеку turbine -> https://github.com/cashapp/turbine
Для Flow, да, можно турбиной, можно и вручную протестировать. Но как протестировать именно композный State, когда в него подряд несколько значений отправляется. Или турбиной можно и композный State проверить?
да, можно почему бы и нет
assertEquals(1, turbine1.awaitItem()) assertEquals(2, turbine2.awaitItem()) turbine1.awaitComplete() turbine2.awaitComplete()
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
А без турбины если как-то попробовать? Это в какую сторону смотреть? Просто у самого State чего-то, что даёт подписаться на изменения не нашел
без турбины я бы сделал обьертку над флоу и в тесте заюзал бы феиковый класс
Ммм... То есть обёртка бы была interface Wrapper<T> { val value: T } Во VM публичное поле вместо State<Int> тогда Wrapper<Int>, а в тесте StateFlow<Int>?
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 } }
что-то вроде этого. просто с дженериком
Но ведь ViewModel выдает наружу композный State<Int>. Если делать обёртку, которая возвращает StateFlow, то не проще ли сразу StateFlow возвращать из VM вместо композного State. Да и не уж то ради тестов композного State нужно делать приседания с основным кодом...
да просто тестировать флоу без турбины я точно уж не знаю. поэтому сделаю обьертку
Без турбины спокойно можно тестировать. Просто приседаний чуть побольше
ну типо причина турбины это и есть легко тестировать флоу. если ты не хочешь турбины сделай врапперы. это тоже легко
Ну не знаю... FlowWrapper кажется полностью заменять начинает композный State, если правильно понимаю...
что ты имеешь в виду компоузный стеит?
Обычный State из композа https://developer.android.com/jetpack/compose/state#state-in-composables interface MutableState<T> : State<T>
враппер это просто альтернативное решение проблемы без использывания сторонних либ
мм понял. я эту штуку не юзал. но уверен что со стеитфлоу можно добиться тех же результатов что и со mutableStateOf
Просто обычный StateFlow можно протестировать без оберток. Просто поток данных записать в List и после сравнить. И обертки в коде VM не нужны будут
ну у тебя же есть проблема что не можешь просто протестить сразу обычный стеитфлоу в тестах
Не, у меня сложность, что не понимаю, как тестировать mutableStateOf, он же MutableState, он же State, когда в него идёт поток данных. А с обычными корутиновскими flow все понятно))
лол)) там mutableStateOf. я почему то думал что там mutableStateFlow)
Бывает) Я тож с этой штукой недавно относительно познакомился)
@Nikoloz145 но спасибо за идеи большое 👍))
Обсуждают сегодня