フローを使用して Kotlin の実装をテストしようとしています。テストには Kotest を使用します。このコードは機能します:
ビューモデル:
val detectedFlow = flow<String> {
emit("123")
delay(10L)
emit("123")
}
テスト:
class ScanViewModelTest : StringSpec({
"when the flow contains values they are emitted" {
val detectedString = "123"
val vm = ScanViewModel()
launch {
vm.detectedFlow.collect {
it shouldBe detectedString
}
}
}
})
ただし、実際の ViewModel ではフローに値を追加する必要があるため、次のように使用ConflatedBroadcastChannel
します。
private val _detectedValues = ConflatedBroadcastChannel<String>()
val detectedFlow = _detectedValues.asFlow()
suspend fun sendDetectedValue(detectedString: String) {
_detectedValues.send(detectedString)
}
次に、テストで次のことを試みます。
"when the flow contains values they are emitted" {
val detectedString = "123"
val vm = ScanViewModel()
runBlocking {
vm.sendDetectedValue(detectedString)
}
runBlocking {
vm.detectedFlow.collect { it shouldBe detectedString }
}
}
テストがハングするだけで、完了しません。私はあらゆる種類のことを試しました:launch
またはrunBlockingTest
の代わりにrunBlocking
、送信と収集を同じまたは別のコルーチンに入れます...offer
の代わりにsend
...何も修正していないようです。私は何を間違っていますか?
更新: フローを手動で作成すると動作します:
private val _detectedValues = ConflatedBroadcastChannel<String>()
val detectedFlow = flow {
this.emit(_detectedValues.openSubscription().receive())
}
それで、それはasFlow()
メソッドのバグですか?