首页 > 解决方案 > 如何使用代表视图状态的密封类测试视图模型?

问题描述

我正在尝试为我的视图模型创建单元测试,基本上视图模型调用存储库函数然后返回其结果,然后视图模型将结果发送回视图但在密封类中。我正在使用onChanged测试视图模型,所以想法是验证第一个onChanged,它必须是Loading,然后第二个必须是Photos,它是部分的,因为我必须创建另一个Photo密封类,在那里插入假列表,然后使用验证,但当然这两个结果是不同的,因此属于同一类型。

如何测试一系列视图状态?

要测试的viewmodel方法:


    fun doPhotoRequest(albumId: Long) {
        viewModelScope.launch {
            _state.value = (PhotosViewState.Loading)

            albumsRepository.getPhotos(albumId).let { response ->
                if (response is Response.Success) {
                    _state.value = (PhotosViewState.Photos(response.data.sortedBy { it.title.length }))
                } else {
                    val error = (response as Response.Error).exception.localizedMessage
                    _state.value = (PhotosViewState.Error(error))
                }
            }
        }
    }

密封类

sealed class PhotosViewState {
    object Loading : PhotosViewState()
    class Error(val error: String?) : PhotosViewState()
    class Photos(val photos: List<Photo>) : PhotosViewState()
}

测试(只执行第一行没有任何错误)

verify(viewState, times(1)).onChanged(PhotosViewState.Loading) verify(viewState, times(1)).onChanged(PhotosViewState.Photos(list))

标签: unit-testingkotlinmvvmandroid-livedata

解决方案


推荐阅读