簡體   English   中英

測試中 delay() 與 withTimeout() 協程的區別

[英]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立即推進時間,但在啟動時,您需要使用advanceUntilIdleadvanceUntilIdle advanceTimeBy(2000)將時間移動到您可以在事件狀態之前、中間或之后的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM