适用于iOS App的简单MVP架构
如何使用iOS应用程序的单元测试创建简单的MVP架构
定义功能要求对于开发应用程序很重要。 它是描述用户与应用程序之间交互的用户故事列表。 用户故事可以使用以下模式编写: “作为,我可以 ”。
我将通过简单的场景向您展示iOS应用程序的Model View Presenter(MVP)架构的实现。 该应用程序是一个注册页面。 作为用户,我可以使用电子邮件,密码,全名和电话号码注册自己的身份。
以上功能要求的一句话看起来很简单。 但是实际用户可能会有各种各样的行为。 也许他没有写下电话号码。 用户输入的密码可能少于5个字符,而您的应用程序只允许输入8个字符以上的密码。 为了适应用户行为的所有组合,让我们进行测试。
- 用户通过填写所有字段进行注册。
期望 :注册成功 - 用户注册,但电子邮件字段未填写。
期望 :注册失败,并显示消息“电子邮件不能为空” - 用户注册,但密码字段未填写。
期望 :注册失败,并显示消息“密码不能为空” - 用户注册,但密码字段包含少于8个字符。
期望 :注册失败,并显示消息“最小密码长度为8个字符” - 用户注册,但未填写全名字段。
期望 :注册失败,并显示消息“全名不能为空” - 用户注册,但电话号码字段未填写。
期望 :注册失败,并显示消息“电话号码不能为空”
MVP的基本概念。
使用mvp-arch的原因是使我们的代码库可测试。 根据干净架构的概念,我们应该在业务逻辑和视图逻辑之间建立严格的界限。 因此,我们可以分别测试业务逻辑部分和查看逻辑部分。 因此,如果我们在UIViewController上放置任何逻辑都是不好的。
视图是负责控制视图组件(如Button,UITextField,UITableView,UIImageView)状态的部分。 它由启用或禁用按钮的命令或显示或隐藏UIImageView的命令组成。 此外,还应负责管理UIViewController生命周期的状态。 另一部分是演示者,负责处理业务逻辑。 它可能包含一组显示或隐藏UIImageView的规则。 对我而言,模型是仅包含简单迅捷对象的部分。 负责保持某些相关对象的状态。
让我们通过在申请中显示注册页面来进行概念验证。
#1。 建立一个新项目。
我只是用一个页面创建一个简单的应用程序。 它包含四个UITextField和一个Button,将根据业务规则进行控制。
#2。 编写单元测试。
让我们从创建一个初始单元测试开始。 这源自我们之前讨论的测试方案。 有一会儿,我将XCTAssertFail()
放到每个测试函数中,直到实现真正的实现为止。
上面的所有单元测试功能都是业务规则。 因此,我们需要创建一个空类来写下业务逻辑。 如前所述,业务逻辑应在Presenter部分中处理,因此我们必须启动一个名为RegistrationPagePresenter
的新类。
让我们看一下MockUIViewController1
部分。 它代表真实项目中的UIViewController
。 它不知道检查空电子邮件的逻辑。 UIViewController只需访问命令register(…)
,然后通过RegistrationDelegate
从RegistrationPresenter
接收响应。
#3。 实施
现在,让我们创建RegistrationPresenter的实现,以检查电子邮件是否为空。 我们应该在这里写下其他业务逻辑以验证注册过程。
现在,我们可以通过单击菜单栏上的产品>测试来运行统一测试。 让我们看看会发生什么。 不要忘记在注册过程中完成业务规则的实施。 您可以在Github上查看我的完整源代码。
#4。 运行应用
通过手动填充所有注册数据来启动应用程序并进行手动测试的时间。 您看到下面的代码有多干净吗?
最后,我们到达教程的结尾。 对我来说,MVP架构足以使我们的代码基础更好。 它易于学习,易于测试且易于维护。