[英]Difference between delay() vs withTimeout() coroutine in Testing
I'm writing some test case with coroutine我正在用协程写一些测试用例
class ArticleViewModel : ViewModel() {
private var likeCount = 0
fun getLikeCount() = likeCount
fun addLikeCount() {
viewModelScope.launch {
likeCount += 1
likeCount
}
}
}
@ExperimentalCoroutinesApi
private fun MainCoroutineRule.runBlockingTest(block: suspend () -> Unit) =
this.testDispatcher.runBlockingTest {
block()
}
@ExperimentalCoroutinesApi
class MainCoroutineRule(
val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher() {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(testDispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
}
@ExperimentalCoroutinesApi
class ArticleViewModelTest {
@get:Rule
var mainCoroutineRule = MainCoroutineRule()
@Test
fun addLikeCount() = mainCoroutineRule.runBlockingTest {
val articleViewModel = ArticleViewModel()
articleViewModel.addLikeCount()
Assert.assertEquals(1, articleViewModel.getLikeCount())
}
}
addLikeCount() test case above is working fine until I try to change logic addLikeCount().上面的 addLikeCount() 测试用例工作正常,直到我尝试更改逻辑 addLikeCount()。
case 1:情况1:
fun addLikeCount() {
viewModelScope.launch {
delay(2000)
likeCount += 1
likeCount
}
}
case 2:案例2:
fun addLikeCount() {
viewModelScope.launch {
withTimeout(2000) {
likeCount += 1
likeCount
}
}
}
I want to delay 2 second (example: call API), then continuing handle logic (likeCount += 1, ....).我想延迟 2 秒(例如:调用 API),然后继续处理逻辑(likeCount += 1, ....)。
In case 1, addLikeCount() test case is fail在情况 1 中, addLikeCount() 测试用例失败
In case 2, addLikeCount() test case is pass在情况 2 中, addLikeCount() 测试用例通过
I don't know why?我不知道为什么? what is difference between delay vs withTimeout?
延迟与 withTimeout 有什么区别? If you understand my problem, please help me.
如果您了解我的问题,请帮助我。 Thank you so much.
非常感谢。
withTimeout
立即推进时间,但在启动时,您需要使用advanceUntilIdle
或advanceUntilIdle
advanceTimeBy(2000)
将时间移动到您可以在事件状态之前、中间或之后的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.