状态机 - 他们已经出现了计算机科学的很长一段时间,但在过去几十年里被遗忘的可能,至少在移动应用程序。我的团队在Wayfair选择重新状态机,让他们在我们的生产应用程序一试。这就是我们如何临到MvRx并促成了他们的开源项目。188金博宝备用

关于驿站应用

在我们深入,我们的应用程序一点背景知识。该驿站应用支持在Wayfair内部用户,为贸易展览做准备。我们需要支持离线模式的应用程序,以便它可以在低于理想的互联网条件,这是在贸易展览的一个常见问题的作用。我们与已知的历史上最可靠的系统进行竞争 - 笔和纸!为了赢得那场比赛,我们需要有一个非常坚实,稳定的移动应用程序。我们需要一种方法,我们可以有一个将完全取决于我们的实体代表状态无状态的看法。

为了实现这一点,我们决定重新处理我们的架构。在研究不同的解决方案时,我们遇到了MvRx库从制作的Airbnb。它看起来像它可以帮助我们实现我们所需要的。我们来到的是一个混合型MVVM+数据绑定+MvRx,这保证其自己的文章给上下文的用量更大。敬请期待另一个时间!

最关键的部分是有〜我们的业务逻辑,从我们的QA团队创造更多的工作,以防止开发商,或者更糟的100%的测试代码覆盖率,出货错误。我们必须沿着这条路一些颠簸 - 在这里,我们将解释捐款给我们,通过他们全部是怎么MvRx代码库。

开始吧

谢谢数据绑定MvRx,我们设法通过具有简化我们的片段ViewBinding层。

的责任ViewBinding层是保持状态和视图之间的连接。该ViewBinding在每个状态变化层反应并填充用新数据的视图,但也反应以任何UI事件并将其传播到视图模型。基于业务逻辑,视图模型然后触发的状态变化。因此,圆弧被关闭;我们有一个很好的,单向数据流,如下图所示:

视图模型是保持状态和触发状态改变的唯一层的层。在我们的视图层,很少有逻辑,我们经常测试。这主要是国家的纯被动的表示。有些项目在这次真的严格,导致背部和往复至视图模型,这引入回调的爆炸。我们决定要务实,不经过视图模型如果我们没有需要。

什么单元测试?

视图模型层是上下文,所以我们没有得到100%的测试代码覆盖的任何问题。

ViewBinding然而,这是一个棘手的问题。这里有几个问题,但到目前为止最具挑战性的问题之一是如何运行由MvRx。让我们来看看代码:

viewModel.selectSubscribe(TaskDetailState :: taskDeleted){taskDeleted  - >如果(taskDeleted){// ...根据状态变化改变视图}}

如果你深入了解了selectSubscribe功能,你会发现,如果从调用它MvRxView,它会自动检索lifecycleOwner从给定的片段。因此,为了得到成以上,片段需要处于恢复状态的订阅块。这是一个能够检索和订阅真正重要的优化视图模型■在一个视图生命周期感知方式。这是一个类似LiveData,这是生命周期感知观察的,但这种行为绝不会在单元测试中发生。有没有办法进入一个功能块和测试涉及此块的代码。

我们的贡献

为了缓解上述问题,我们的团队开辟了GitHub的问题吧,在这里看到:https://github.com/airbnb/MvRx/issues/198。与制作的Airbnb团队短暂的交谈之后,我们能够拿出一个解决方案,在这里看到:https://github.com/airbnb/MvRx/pull/235

我们建立了我们推动我们的架构出来到野外一个待办事项示例应用程序。这待办事项应用程序如下规格在里面谷歌Android的样品建筑库。我们是独一无二的,因为它是MvRx和数据在其核心架构结合的组合,并利用技术,如房数据库,RxJava和匕首。看看这个这里

随着最新版本MvRx,我们能够测试上面这段代码,并已颠簸了测试代码覆盖率。我们可以用很简单的片段,上下文自由来实现这一视图模型使用,以及使用MvRxViewBinding层。

我们拥有令人难以置信的高测试代码覆盖率在我们的应用程序,和我们的骄傲!我们不使用工具来嘲笑Android的背景下,这意味着测试是非常快。正因为如此,我们在我们的代码非常有信心,并能快速,可靠地出货,以及能够贡献回到开源社区帮助别人遇到了同样的难题。188金博宝备用