通过单元测试如何测试 viewModel 中的 switchMap 从存储库类调用正确的方法 [英] With unit testing how to test a switchMap in viewModel calls the proper method from repository class

查看:38
本文介绍了通过单元测试如何测试 viewModel 中的 switchMap 从存储库类调用正确的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 ViewModel 中,我使用了带有 liveData 变量作为参数的 swithcMap.当 liveData 变量被设置/更改时,switchMap 从我的存储库调用一个方法.我的视图模型代码:

In my ViewModel i have used swithcMap with a liveData varaible as parameter. When the liveData variable gets set/changed then the switchMap calls a method from my Repository. My viewModel code:

class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() {

    var searchQuery:MutableLiveData<SearchQuery> = MutableLiveData()
    var liveResult:MediatorLiveData<My_Result> = MediatorLiveData()


    var apiData:LiveData<My_Result> = Transformations
    .switchMap(searchQuery){query ->
        query?.let {
        val source: LiveData<My_Result> = mainRepository.fetchApiresultFromClient(it.filter_search , it.filter_topics, it.filter_language , it.page_number)

        liveResult.addSource(source){ item->
            liveResult.value = item
            liveResult.removeSource(source)
        }

        source

        }
    }

}

现在我想测试一下是否设置了searchQuery:

Now I want to test that if searchQuery is set then:

  • switchMap 被触发
  • 并且当 switchMap 被触发时 mainRepository.fetchApiresultFromClient(..) 被调用
  • 如果 mainRepository.fetchApiresultFromClient(..) 被调用,则返回的类型是 LiveData

我该怎么做?我所能做的就是:

How do I do this? All I have managed to do is :

@ExtendWith(InstantExecutorExtension::class)
class MainViewModelTest {

    lateinit var  mainViewModel: MainViewModel

    @Mock
     lateinit var  mainRepository: MainRepository


    @BeforeEach
    fun init()  {
    MockitoAnnotations.initMocks(this)
    mainViewModel = MainViewModel(mainRepository)
    }


    @Test
    @Throws(Exception::class)
    fun setSearchQuery_callsRepositoryMethod() {
    var filter_search: SearchQuery = SearchQuery("java", "","",1)

    }

}

推荐答案

为了使您的代码更易于测试,您可以将其替换为:

To make your code easier to test you could replace it by:

class MainViewModel @Inject constructor(val mainRepository: MainRepository) : ViewModel() {

    val searchQuery:MutableLiveData<SearchQuery> = MutableLiveData()

    var apiData:LiveData<My_Result> = Transformations.switchMap(searchQuery) { query ->
        query?.let {
            mainRepository.fetchApiresultFromClient(it.filter_search , it.filter_topics, it.filter_language , it.page_number)
        }
    }
}

那你应该

  • mock mainRepository.fetchApiresultFromClient 返回一个 MutableLiveData
  • 调用 mainViewModel.searchQuery.value = Query(...)
  • 并断言当 mainRepository 发出新值时 apiData 也发出相同的值.
  • mock mainRepository.fetchApiresultFromClient to return a MutableLiveData
  • call mainViewModel.searchQuery.value = Query(...)
  • and assert that when mainRepository emits a new value apiData also emits the same value.

如果你有一些测试代码要分享,我可以帮你完成

If you have some test code to share I can help you to complete it

这篇关于通过单元测试如何测试 viewModel 中的 switchMap 从存储库类调用正确的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆