Tim Malseed
11/26/2023, 11:48 PMTim Malseed
11/26/2023, 11:49 PMclass SystemUnderTest(
externalEvents: SharedFlow<Int>
) {
private val _internalEvents = Channel<String>()
val internalEvents = _internalEvents.receiveAsFlow()
val mappedEvents = externalEvents.map { number ->
_internalEvents.send(number.toString())
}
}
This is a representation of a real ViewModel that I’m dealing with. Ideally we’d refactor it, but let’s say we need test coverage first..
So, here’s a test that tries to assert that when an external event receives a new value, our internal channel is updated:
class MixedFlowsTest() {
@Test
fun testCase() = runTest {
// Arrange
val externalEvents = MutableSharedFlow<Int>()
val systemUnderTest = SystemUnderTest(externalEvents)
// Act
systemUnderTest.internalEvents.test {
externalEvents.emit(1)
// Assert
Assertions.assertEquals("1", awaitItem())
}
}
}
Tim Malseed
11/26/2023, 11:50 PMmappedEvents
, so _internal_events.send()
never gets calledTim Malseed
11/26/2023, 11:50 PMclass MixedFlowsTest() {
@Test
fun testCase() = runTest {
// Arrange
val externalEvents = MutableSharedFlow<Int>()
val systemUnderTest = SystemUnderTest(externalEvents)
val job = launch {
systemUnderTest.mappedEvents.collect()
}
// Act
systemUnderTest.internalEvents.test {
externalEvents.emit(1)
// Assert
Assertions.assertEquals("1", awaitItem())
}
// Cleanup
job.cancel()
}
}
But still, the test fails with ‘no value produced’Tim Malseed
11/26/2023, 11:51 PMTim Malseed
11/27/2023, 12:38 AMexternalEvents.emit(1)
to its own launch{}
block, before the .test{}
seems to solve the problem. I think it’s to do with the code indefinitely suspending on that emit
call. I don’t understand it tho