https://kotlinlang.org logo
#russian
Title
# russian
e

Eugen Martynov

08/17/2021, 8:24 AM
Блин, почему так сложно писать тесты на корутины и флоу?
Как легко протестировать, что flow.count() == 0?
b

bezrukov

08/17/2021, 9:40 AM
чаще всего просто
runBlocking
(не runBlockingTest) достаточно, т.е.
Copy code
fun test() = runBlocking { 
    assertEquals(0, flow.count())
}
еще есть https://github.com/cashapp/turbine для тестирования flow
e

Eugen Martynov

08/17/2021, 10:32 AM
Денис спасибо, но такой пример просто виснет
В турбине пока нет решения для проверки пустого флоу
b

bezrukov

08/17/2021, 10:35 AM
если он виснет, то скорее всего что-то не так с флоу, возможно там stateflow/sharedflow?
a

altavir

08/17/2021, 10:56 AM
Он висенет если это бесконечный Flow
Для того, чтобы "не висло" поставьте таймаут
e

Eugen Martynov

08/17/2021, 6:38 PM
Это бесконечный флоу, и только тестировать его с таймаутом? Можно так чтобы тестовый контекст завершал все дочерние джобы и проверял бесконечные флоу? Тогда не нуюен таймаут. Наверное такое возможно для турбины написать. Гляну на выходных.
Спасибо!
a

altavir

08/17/2021, 6:40 PM
Ну в общем случае нет возможности проверить окончание flow. Потому что он может выдать элемент в неопределенном будущем ленивым образом. Он будет ожидать следующий элемент пока не словит отмену
a

aleksey.tomin

08/18/2021, 5:27 PM
В целом да, тестировать корутины бывает сложно. Но тестировать многопоточный код БЕЗ корутин - это намного сложнее 🤯
e

elizarov

08/19/2021, 10:33 AM
plus one С корутинами обычно можно одно-поточный тест написать. Иногда все-равно приходится ломать голову из-за асинхронности, но сильно меньше чем приходится при тестировании многопоточного кода.
👍 1
22 Views