适用于iOS App的简单MVP架构

如何使用iOS应用程序的单元测试创​​建简单的MVP架构

定义功能要求对于开发应用程序很重要。 它是描述用户与应用程序之间交互的用户故事列表。 用户故事可以使用以下模式编写: “作为,我可以 ”。

我将通过简单的场景向您展示iOS应用程序的Model View Presenter(MVP)架构的实现。 该应用程序是一个注册页面。 作为用户,我可以使用电子邮件,密码,全名和电话号码注册自己的身份。

以上功能要求的一句话看起来很简单。 但是实际用户可能会有各种各样的行为。 也许他没有写下电话号码。 用户输入的密码可能少于5个字符,而您的应用程序只允许输入8个字符以上的密码。 为了适应用户行为的所有组合,让我们进行测试。

  1. 用户通过填写​​所有字段进行注册。
    期望 :注册成功
  2. 用户注册,但电子邮件字段未填写。
    期望 :注册失败,并显示消息“电子邮件不能为空”
  3. 用户注册,但密码字段未填写。
    期望 :注册失败,并显示消息“密码不能为空”
  4. 用户注册,但密码字段包含少于8个字符。
    期望 :注册失败,并显示消息“最小密码长度为8个字符”
  5. 用户注册,但未填写全名字段。
    期望 :注册失败,并显示消息“全名不能为空”
  6. 用户注册,但电话号码字段未填写。
    期望 :注册失败,并显示消息“电话号码不能为空”

MVP的基本概念。

使用mvp-arch的原因是使我们的代码库可测试。 根据干净架构的概念,我们应该在业务逻辑和视图逻辑之间建立严格的界限。 因此,我们可以分别测试业务逻辑部分和查看逻辑部分。 因此,如果我们在U​​IViewController上放置任何逻辑都是不好的。

视图是负责控制视图组件(如Button,UITextField,UITableView,UIImageView)状态的部分。 它由启用或禁用按钮的命令或显示或隐藏UIImageView的命令组成。 此外,还应负责管理UIViewController生命周期的状态。 另一部分是演示者,负责处理业务逻辑。 它可能包含一组显示或隐藏UIImageView的规则。 对我而言,模型是仅包含简单迅捷对象的部分。 负责保持某些相关对象的状态。

让我们通过在申请中显示注册页面来进行概念验证。

#1。 建立一个新项目。

我只是用一个页面创建一个简单的应用程序。 它包含四个UITextField和一个Button,将根据业务规则进行控制。

#2。 编写单元测试。

让我们从创建一个初始单元测试开始。 这源自我们之前讨论的测试方案。 有一会儿,我将XCTAssertFail()放到每个测试函数中,直到实现真正的实现为止。

上面的所有单元测试功能都是业务规则。 因此,我们需要创建一个空类来写下业务逻辑。 如前所述,业务逻辑应在Presenter部分中处理,因此我们必须启动一个名为RegistrationPagePresenter的新类。

让我们看一下MockUIViewController1部分。 它代表真实项目中的UIViewController 。 它不知道检查空电子邮件的逻辑。 UIViewController只需访问命令register(…) ,然后通过RegistrationDelegateRegistrationPresenter接收响应。

#3。 实施

现在,让我们创建RegistrationPresenter的实现,以检查电子邮件是否为空。 我们应该在这里写下其他业务逻辑以验证注册过程。

现在,我们可以通过单击菜单栏上的产品>测试来运行统一测试。 让我们看看会发生什么。 不要忘记在注册过程中完成业务规则的实施。 您可以在Github上查看我的完整源代码。

#4。 运行应用

通过手动填充所有注册数据来启动应用程序并进行手动测试的时间。 您看到下面的代码有多干净吗?

最后,我们到达教程的结尾。 对我来说,MVP架构足以使我们的代码基础更好。 它易于学习,易于测试且易于维护。