【问题标题】:Is necessary to create an LiveDataObserver only for one action like this.?是否有必要仅为这样的一个操作创建 LiveDataObserver。?
【发布时间】:2020-10-26 04:37:04
【问题描述】:

我有下一段代码,我想为下一个按钮添加单元测试,一位朋友说“创建一个实时数据观察者只是为了测试每个功能太多了”。问题是我至少有 10 个按钮,它们具有不同的操作,如意图、计算、发送数据等。每个按钮做不同的事情,一些代表动作,另一些代表事件。

图片只是其中之一。但问题是,如何使其可测试,我了解测试我需要在 viewModel 上创建一个方法,并制作一个 LiveData 只返回到视图并在片段中注册观察者只是为了做出意图,我听起来像“四处走走”。如果视图不需要“观察”什么,只通知视图做某事,为什么我应该只为一个 Intent 设置一个观察者。

其他 10 个按钮类似。我真的需要创建一个 liveData 来测试每个按钮吗?有一个观察者并立即返回视图只做那些事情听起来很夸张。有更好的方法吗?

   buttonContainer.setOnClickListener {
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        val uri: Uri = Uri.fromParts(SCHEME, activity?.packageName, null)
        intent.data = uri
        startActivity(intent)
    }
// Each of those make one action, but to have an observer for each, don't sounds good, 
// why whould I need an observer only for one action , but if don't, I couldn't test it 
liveDataAction1.value = true
liveDataAction2.value = true
liveDataAction3.value = true
liveDataAction4.value = true
liveDataAction5.value = true

【问题讨论】:

  • 粘贴代码总是比添加代码图像更好。
  • 你想写单元测试还是 UI 测试?
  • 我想在viewModel中写单元测试

标签: android mvvm android-livedata


【解决方案1】:

您可以拥有一个LiveData<Consumable<Event>>,而不是多个LiveData

Consumable 只是一种确保您的事件只被消费一次的模式 (Read this for more information)

然后将您的Event 定义为:

sealed class Event {
    class OpenDetail(id: Long): Event
    object OnSuccess(): Event
    ....
}

然后在您的测试中,您只需验证调用方法 x 会导致相应的 Event 被发送出去。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2018-06-05
    • 2012-04-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多