如何对ConflatedBroadcastChannel进行单元测试?

问题描述

在这里一个测试,试图验证发送到ConflatedbroadcastChannel(实验性API,我知道)的内容

sudo apt install deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/
sudo apt-get upgrade r-base

但是,当我运行该代码时,我收到带有消息的IllegalStateException:“此作业尚未完成”。有人知道缺少什么吗?我也尝试过使用TestCoroutinedispatcher,但无济于事。

解决方法

如果您只想从通道中获取单个值,则可以始终使用receive。 由于ConflatedBroadcastChannel会缓存最新值,因此您可以像这样使用它:

@Test
fun myTest() = runBlockingTest {
    val myChannel = ConflatedBroadcastChannel<String>()
    myChannel.send("hello")
    val subscription = myChannel.openSubscription()
    val result = subscription.receive()
    subscription.cancel()
    assertEquals("hello",result)
}
,

因此,我想到了收到的消息,并怀疑“尚未完成的作业”是我正在执行的.consumeEach操作。因此,为了明确起见,我将操作包装在launch(myTestCoroutineDispatcher)中,并称为cancel。这似乎不是测试事物的理想方法,但是考虑到测试环境并没有真正猜测您的频道何时应该停止接收事物,这是有道理的。无论如何,瞧,这可行:

@Test
fun myTest() = runBlockingTest {
    val results = ArrayList<String>()
    val myChannel = ConflatedBroadcastChannel<String>()
    launch(testMainDispatcher) {
        myChannel.openSubscription().consumeEach {
            results.add(it)
            cancel()
        }
    }
    myChannel.send("hello")
    assertEquals(1,results.size)
}

编辑:要获得相同结果,您可以做的另一件事是val myJob = launch {...},然后在测试执行结束时,调用myJob.cancel()以达到相同的效果。