繁体   English   中英

如何让 viewModelScope 在单元测试中等待挂起函数

[英]How to make viewModelScope wait for a suspend function in unit test

正如我们所知,viewModelScope 的默认调度程序并行执行。 如何让 viewModelScope 等待单元测试中的挂起功能。 在我的代码中,我想从repository.getData()获取结果,以便我的断言通过。 现在,我没有按时得到结果。

class MainViewModel(private val repository: Repository,
                     private val dispatcher: CoroutineDispatcherProvider) : ViewModel() {

    private val viewState = MutableLiveData<Results<Data>>()
    fun getViewState() : LiveData<Results<Data>> = viewState



    fun getData(query: search) {
        viewState.value = Loading
        viewModelScope.launch(dispatcher.main()) {
            val results = repository.getData(query) //need to wait for this
            when(results){
                    is Success -> {
                        viewState.value = Success(results.data)
                    }
                    is Error -> viewState.value = Error(“Error”)
                }
        }

主视图模型测试:

 Class MainViewModelTest {

    @get:Rule
    val instantExecutorRule = InstantTaskExecutorRule()

    @get:Rule
    val coroutineTestRule = CoroutineTestRule()


    @Test
    fun `test get data`() = coroutineTestRule.testCoroutineDispatcher.runBlockingTest {
        coEvery{repository.getData(“query”)} returns Success(Data)

        var observer:Observer<Results<Data>> = mock()

        viewModel.getViewState().observeForever(observer)

        viewModel.getData(“query”)

          assertEquals(Loading, state)
          assertEquals(resultSuccess, state)

       }

    }

我认为您应该使用observer.onChanged()进行断言和验证。 否则我看不出有什么问题。

val successResult = Result.Success(Data)
coEvery{repository.getData(“query”)} returns successResult

verify { observer.onChanged(Result.Loading) }
verify { observer.onChanged(successResult) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM