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 ответов

59 просмотров

для тестирования флоу насколько я знаю используют библиотеку 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 Автор вопроса

Обычный 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 но спасибо за идеи большое 👍))

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта