iOS VIPER : How protocol helps in Unit Testing?

标签 ios objective-c viper-architecture

我对 VIPER 架构中协议(protocol)的好处有点困惑。 我了解 DI(依赖注入(inject))通过协议(protocol)实现,有助于避免对象之间的直接依赖 - 我同意。

但我正在从使用的角度来看真正的好处,一个例子可能是 - 特别是协议(protocol)如何帮助单元测试(测试交互器部分)受益。

我们不能通过方法回调的 using block 来实现相同的目的吗? 希望有人可以通过一些例子帮助我从使用角度理解

干杯

最佳答案

使用回调,例如从交互器到演示器,可能会使测试演示器变得更加困难。

在编写演示器如何处理输入(从交互器发送)的测试时,您的测试必须调用演示器上的某些方法,这将导致演示器调用交互器,这将导致交互器发送数据给演示者。

通过让 Presenter 实现 Interactor 定义的协议(protocol),您的测试可以直接调用 Presenter 上适当的输入方法。

就声明协议(protocol)而言,我以模拟角色的方式实践 TDD,而不是对象 ( http://www.jmock.org/oopsla2004.pdf )。这些协议(protocol)通过关注对象做什么(它的角色)而不是它如何做来帮助提供更好的抽象。

协议(protocol)本身对于单元测试来说没有什么值(value)。您的单元测试将为被测系统的依赖项提供测试替身 ( http://martinfowler.com/bliki/TestDouble.html )。即使您将依赖项公开为具体类,您仍然可以为测试创建测试替身。

在 Objective-C 中,您可以使用模拟库,例如 OCMock ( http://ocmock.org ) 或 OCMockito ( https://github.com/jonreid/OCMockito ),来创建具体类的 stub 、 spy 或模拟。

在 Swift 中,您可以通过对用作依赖项的每个具体类进行子类化来创建测试替身。

简而言之,协议(protocol)不是用于简化单元测试,而是用于在更高的抽象级别上描述应用程序的功能。

以下示例说明了抽象协议(protocol)在事后如何发挥作用:

我创建了一个协议(protocol)来表示用户可以在屏幕上执行的操作,例如ProfileUserActions,具有 changeNamechangeAddress 等操作。 Presenter 实现了 ProfileUserActions,View 接受 ProfileUserActions 作为依赖项。当用户点击屏幕上的按钮时, View 会将适当的消息发送到其 userActions 对象。

当我想要添加分析时,我能够创建一个新的、独立的 ProfileAnalytics 类,该类还实现了 ProfileUserActions。我在 View 和演示器之间插入了分析对象,这允许应用程序捕获分析,而无需修改 View 或演示器。

关于iOS VIPER : How protocol helps in Unit Testing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198279/

相关文章:

ios - 如何在 VIPER 设计模式中将 ViewController Reference 传递给 Router?

ios - Swift 中的隐式解包选项似乎不起作用

ios - 在 iOS 7 中添加电子邮件和通话链接到主屏幕中断

ios - 怎么画的时候不清空UIView?

objective-c - Apple 检查返回值而不是错误的模式背后的基本原理是什么?

iphone - 计算核心数据中的不同项目

ios - iTunes Connect - 无效的 Swift 支持 - Watch OS 应用程序在两个位置都有 Swift 库

ios - 使用未声明的类型 'MessagingDelegate'

ios - 为基于 iOS 的项目实现 MVC vs MVVM vs VIPER 的真实场景

design-patterns - NSFetchedResultsController 在 VIPER 架构中的位置是什么?