1

我在VIPER博客中读到,将视图控制器的代码移动到Presenter代码中可以很容易地进行单元测试。博客中给出的原因是其中Presenter没有任何与UIKit相关的代码。

这如何使单元测试更容易。有人可以详细解释一下吗?或者除了避免大规模视图控制器问题之外,还有其他优势吗?

4

1 回答 1

2

单元测试中最大的问题是如何模拟一些东西。您想测试一个方法,但该方法正在调用其他 3 个方法,并且您不想测试这 3 个方法,因此您想模拟它们以返回一些固定值。

这在 Javascript 等语言中非常容易,您可以在任何对象上替换方法,或者在可以执行相同操作的 Objective-C 中(尽管难度更大)。

这在 Swift 这样的语言中并不容易。因此,Viper 提出了将视图控制器拆分为单元(例如 Presenter、Interactor、View、Router)的想法,每个单元都有自己的协议。现在要模拟一个单元,您可以只实现协议并使用它而不是真正的 Presenter 或 View。

(您实际上可以使用一些工具在测试中为您动态生成模拟)

这使得单元测试变得更加容易。

但是请注意,单元测试 UI 绝非易事。UI 通常以难以进行单元测试的方式运行,而单元测试 UI 几乎总是意味着您将在单元测试中复制大量应用程序代码。UI 更常通过集成测试进行测试(例如,自动单击和验证屏幕上可见的内容)。

Viper 不是一个糟糕的架构。关注点分离是许多程序员都在努力解决的问题,拥有严格的架构规则并不是一个坏主意。对于复杂的屏幕,您仍然无法避免使用大型控制器,但至少您将被迫将一些代码移出控制器。

海量视图控制器不是 MVC 模式的问题。它们是关注点分离不良的问题,Viper 中的严格规则有助于避免这种情况。

于 2018-08-17T13:08:06.727 回答