android - Android:使用 kotlin 协程的 ViewModel 测试不起作用
问题描述
我是第一次使用协程,在ViewModel
. 测试失败
Wanted but not invoked:
observer.onChanged(<Capturing argument>);
测试如下:
val androidVersioningMock: Versioning.AndroidVersioning = mock {
on { required } doAnswer { "3.3.6" }
}
val versioningMock: Versioning = mock {
on { android } doAnswer { androidVersioningMock }
}
whenever(networkManager.getAppVersionAsync()).thenReturn(GlobalScope.async { versioningMock })
runBlocking {
updateVersionModel =
UpdateViewModel(application, coroutineDispatcherProvider).apply {
updateLiveData.observeForever(stateObserver)
}
verify(stateObserver).onChanged(stateCaptor.capture())
assertTrue(stateCaptor.lastValue is UpdateState.NoUpdate)
assertEquals(UpdateState.NoUpdate, stateCaptor.lastValue)
}
我嘲笑了coroutineDispatcherProvider
with
@ExperimentalCoroutinesApi
override val coroutineDispatcherProvider = mock<CoroutineDispatcherProvider> {
on { main } doAnswer { TestCoroutineContext() }
on { io } doAnswer { TestCoroutineContext() }
}
在我的 ViewModel 中,失败的方法是
private suspend fun getUpdateVersion(): Versioning =
withContext(coroutineDispatcherProvider.io) {
networkManager.getAppVersionAsync().await()
}
执行如下:
launch {
val versioningModel = getUpdateVersion()
...
}
我是不是在嘲笑某事或不做某事?提前致谢!
解决方案
TestCoroutineContext
调度程序对于处理测试中的计时很有用,但您希望同步运行异步调用。您应该能够使用Unconfined
调度程序来实现这一点。
推荐阅读
- angular - msal HTTP_INTERCEPTORS 未自动添加请求标头
- c++ - HDF5Cpp 扩展复合数据集 Hyperslab 问题
- uitableview - UISearchController.searchBar as tableHeaderView 在下拉时导致 UITableView 顶部出现空白 UIView
- css - 仅使用 absolute\left 将 2 个不同宽度的不同元素居中,如何计算偏移量?
- reactjs - 如何从 3rd 方 API 重定向 URL 以响应组件并接收发布/响应数据?
- reactjs - 我如何运行测试以使用 jest 和酶呈现标题。我得到以下错误方法“文本”意味着在 1 个节点上运行。找到了 0 个
- html - 很少有字体可怕的图标没有显示
- mysql - 从消息表中获取不同的最近联系人列
- odoo - “odoo-bin”命令在我的 Odoo 13.0(Windows 安装)中不起作用
- google-ads-api - 使用 Google Ads API 将自己拉进一个盒子。无法验证除我之外的其他用户