首页 > 解决方案 > Android:使用协程测试视图模型

问题描述

我有这个测试方法

private var testDispatcher = TestCoroutineDispatcher()

 @Test
fun test__success() {
    viewModel = MyActivateViewModel(
            "LG_NAME",
            "EXH_NAME",
            "_CODE",
            "C_CODE", controller)
    every {
        controller.activate(any(), any())  
    } returns true

    testDispatcher
            .runBlockingTest {
                viewModel.onOkButtonClicked()
              Truth.assertThat(viewModel.activated.value).isEqualTo(true)
            }

}


fun onOkButtonClicked() {
        viewModelScope.launch {
            val status = activateTask()



            if (status == 0) {
                activated.value = true
            } else {
                activationFailed.value = status
            }
        }
    }

    private suspend fun activateTask(): Int {
        return withContext(Dispatchers.IO) {
            var status = 0
            try {
                controller.activate(code, code)
            } catch (e: LoginException) {
                status = e.reason
            }
            status
        }
    }

既然我打电话给runBlockingTest { viewModel.onOkButtonClicked() 我,我希望这会完成。但是这些行下面的断言失败了。我看到的是协程在执行断言行之前没有完成。如果我在断言之前添加延迟,它会按预期工作。

我的实现有什么问题?什么是正确的方法

标签: androidunit-testingcoroutineandroid-viewmodel

解决方案


推荐阅读