[英]Difference between delay() vs withTimeout() coroutine in Testing
我正在用協程寫一些測試用例
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() 測試用例工作正常,直到我嘗試更改邏輯 addLikeCount()。
情況1:
fun addLikeCount() {
viewModelScope.launch {
delay(2000)
likeCount += 1
likeCount
}
}
案例2:
fun addLikeCount() {
viewModelScope.launch {
withTimeout(2000) {
likeCount += 1
likeCount
}
}
}
我想延遲 2 秒(例如:調用 API),然后繼續處理邏輯(likeCount += 1, ....)。
在情況 1 中, addLikeCount() 測試用例失敗
在情況 2 中, addLikeCount() 測試用例通過
我不知道為什么? 延遲與 withTimeout 有什么區別? 如果您了解我的問題,請幫助我。 非常感謝。
withTimeout
立即推進時間,但在啟動時,您需要使用advanceUntilIdle
或advanceUntilIdle
advanceTimeBy(2000)
將時間移動到您可以在事件狀態之前、中間或之后的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.