2

フローを使用して 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()メソッドのバグですか?

4

1 に答える 1