当我在视图模型中添加协程延迟()时,代码的其余部分将不会被执行。
这是我的演示代码:
class SimpleViewModel : ViewModel(), CoroutineScope {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Unconfined
var data = 0
fun doSomething() {
launch {
delay(1000)
data = 1
}
}
}
class ScopedViewModelTest {
@Test
fun coroutineDelay() {
// Arrange
val viewModel = SimpleViewModel()
// ActTes
viewModel.doSomething()
// Assert
Assert.assertEquals(1, viewModel.data)
}
}
我得到断言结果:
java.lang.AssertionError:
Expected :1
Actual :0
知道如何解决这个问题吗?
您启动一个协程,在设置之前暂停 1 秒data
1. 你的测试只是调用doSomething
但并没有等到data
实际上正在设置中。如果再加一个更长的delay
,测试一下它是否有效:
@Test
fun coroutineDelay() = runBlocking {
...
viewModel.doSomething()
delay(1100)
...
}
您还可以使协程返回Deferred
您可以等待:
fun doSomething(): Deferred<Unit> {
return async {
delay(1000)
data = 1
}
}
With await
无需再延迟您的代码:
val model = SimpleViewModel()
model.doSomething().await()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)