使用 shareIn() 测试 Kotlin Flows
Testing Kotlin Flows with shareIn()
我正在尝试测试使用 shareIn
和 Turbine 的 Flow,但我有点迷茫为什么我的测试失败了以及如何修复它。
class MyTest {
private val scope = CoroutineScope(Dispatchers.Default)
private val mutableSharedFlow = MutableSharedFlow<Int>()
@Test
fun succeeds() = runBlocking {
val sharedFlow = mutableSharedFlow
sharedFlow.test {
expectNoEvents()
mutableSharedFlow.emit(3)
expect(expectItem()).toBe(3)
}
}
@Test
fun fails() = runBlocking {
val sharedFlow = mutableSharedFlow
.shareIn(scope, started = SharingStarted.WhileSubscribed())
sharedFlow.test {
expectNoEvents()
mutableSharedFlow.emit(3)
expect(expectItem()).toBe(3)
}
}
}
在这些测试中,第一个 succeeds()
测试运行良好,但是当我在 fails()
测试中包含 shareIn
时,测试失败并超时:
Timed out waiting for 1000 ms
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms
(Coroutine boundary)
at app.cash.turbine.ChannelBasedFlowTurbine$expectEvent.invokeSuspend(FlowTurbine.kt:238)
at app.cash.turbine.ChannelBasedFlowTurbine$withTimeout.invokeSuspend(FlowTurbine.kt:206)
at app.cash.turbine.ChannelBasedFlowTurbine.expectItem(FlowTurbine.kt:243)
我应该如何测试使用 shareIn
的流程?
我不知道你为什么决定使用 Dispatchers.Default
的范围,如下所示:
...
private val scope = CoroutineScope(Dispatchers.Default)
...
对于测试,只需使用 Dispatchers.Unconfined
,因为它会立即在当前线程上执行协程,而这正是您所需要的。
...
private val scope = CoroutineScope(Dispatchers.Unconfined)
...
因此,应用上述更改后,您的两个测试都成功通过了。
你可以找到我这个问题的示例项目here。
我正在尝试测试使用 shareIn
和 Turbine 的 Flow,但我有点迷茫为什么我的测试失败了以及如何修复它。
class MyTest {
private val scope = CoroutineScope(Dispatchers.Default)
private val mutableSharedFlow = MutableSharedFlow<Int>()
@Test
fun succeeds() = runBlocking {
val sharedFlow = mutableSharedFlow
sharedFlow.test {
expectNoEvents()
mutableSharedFlow.emit(3)
expect(expectItem()).toBe(3)
}
}
@Test
fun fails() = runBlocking {
val sharedFlow = mutableSharedFlow
.shareIn(scope, started = SharingStarted.WhileSubscribed())
sharedFlow.test {
expectNoEvents()
mutableSharedFlow.emit(3)
expect(expectItem()).toBe(3)
}
}
}
在这些测试中,第一个 succeeds()
测试运行良好,但是当我在 fails()
测试中包含 shareIn
时,测试失败并超时:
Timed out waiting for 1000 ms
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms
(Coroutine boundary)
at app.cash.turbine.ChannelBasedFlowTurbine$expectEvent.invokeSuspend(FlowTurbine.kt:238)
at app.cash.turbine.ChannelBasedFlowTurbine$withTimeout.invokeSuspend(FlowTurbine.kt:206)
at app.cash.turbine.ChannelBasedFlowTurbine.expectItem(FlowTurbine.kt:243)
我应该如何测试使用 shareIn
的流程?
我不知道你为什么决定使用 Dispatchers.Default
的范围,如下所示:
...
private val scope = CoroutineScope(Dispatchers.Default)
...
对于测试,只需使用 Dispatchers.Unconfined
,因为它会立即在当前线程上执行协程,而这正是您所需要的。
...
private val scope = CoroutineScope(Dispatchers.Unconfined)
...
因此,应用上述更改后,您的两个测试都成功通过了。
你可以找到我这个问题的示例项目here。