将视图控制器的代码移动到演示器如何使 VIPER 中的单元测试更容易?

How does moving the view controller's code to presenter make it easier to unit test in VIPER?

我在 VIPER 博客中读到,将视图控制器的代码移动到 Presenter 代码使得单元测试变得容易。博客给出的原因是Presenter里面没有任何UIKit相关的代码。

这如何使单元测试更容易。任何人都可以详细解释一下吗?或者除了避免 Massive View Controller 问题之外还有其他优势吗?

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

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

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

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

这使得单元测试变得容易得多。

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

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

Massive View Controllers 不是 MVC 模式的问题。它们是关注点分离不良的问题,而 Viper 中的严格规则有助于避免这种情况。