如何将视图控制器的代码移动到演示者,从而更轻松地在VIPER中进行单元测试?

时间:2018-07-27 07:21:07

标签: ios unit-testing viper viper-architecture

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

这如何使单元测试更容易。有人可以详细解释一下吗?还是除了避免Massive View Controller问题之外,还有其他好处吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

在像Javascript这样的语言中,这很容易,您可以在任何对象上替换方法,也可以在Objective-C中用相同的方法替换(尽管难度更高)。

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

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

这使单元测试容易得多。

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

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

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