带有TDD的手工iOS应用程序中的身份验证规则

让我们从身份验证过程开始,但并非全部开始,目前,我们仅对注册部分感兴趣。 这部分具有一些验证和重要行为。 此实现将使我们能够与一些BASS内容进行交互,这代表了应用程序难题的重要组成部分。 在这篇文章中,我们将介绍:

  • 测试驱动开发
  • 输入数据验证
  • 准备与外部服务的一些集成
  • 您可以在此处检查相关的github问题。

用户注册用例

该项目将使用自下而上的流程进行开发。 因此,我们将从编写测试和规则开始,而不是进行注册或登录屏幕。 第一个测试即将尝试使用空电子邮件值注册用户。

经过绿色测试之后,该重构用例类了。 第一个奇怪的是寄存器功能处的mutating关键字。 需要使用此关键字是因为该函数试图更改默认情况下不可变的结构值。

此应用程序将使用称为Clean Architecture的体系结构,该体系结构将软件分层。 这些层对于隔离按行为分开的组件和职责至关重要。 清洁体系结构和SOLID原则值得一提,我将在稍后单独讨论。

通过将软件划分为多个层,并遵循“依赖关系规则”,您将创建一个具有内在可测试性的系统,并具有其所隐含的所有优势。
马丁,罗伯特。 “清洁建筑” 2012

同样,此用例正在保存应该在表示层中的状态。 不在“应用程序业务规则”层中。 为了解决这个问题,我们可以创建一个演示者。

…我们也不希望该层受到数据库,UI或任何常用框架等外部性变化的影响。 该层与此类问题无关。
马丁,罗伯特。 “清洁建筑” 2012

上面的协议将成为演示者。 而且它的实现与用例无关紧要。 用例只需要具有故障方法的东西。 在我们的测试环境中,我们将使用演示者的测试双精度表示形式,该表示形式为存根精度类型。

出于测试目的,我们可以用等效的“特技替身”: Test Double来代替真实的DOC(而不是SUT!)。
迈扎罗斯(Meszaros),杰拉德(Gerard)。 2009年“ Test Double”

存根提供对测试过程中进行的呼叫的固定答复,通常通常根本不响应为测试编程的内容。 存根还可以记录有关呼叫的信息,例如,电子邮件网关存根可以记住“已发送”的消息,或者仅记住“已发送”的消息数量。
福勒,马丁。 “不打Mo”,2007年

用例已更改为通过依赖关系使用演示者。

演示者将用作用例的依赖项,这样做将符合SOLID原则,更具体地讲是Dependency Inversion一个。 原则指出:

答:高级模块不应依赖于低级模块。 两者都应依赖抽象。
B.抽象不应依赖细节。 细节应取决于抽象。
马丁,罗伯特。 “依赖倒置原则”,2003年

也就是说,现在测试再次失败。 不要为此做一个丑陋的面孔,这是一个好兆头。 Xcode抱怨是游戏的一部分,请尽情享受=)。 完成测试要求后,代码应如下所示:

现在可以运行测试,并看到绿灯! 下一步包括使新测试看到它们失败等等。 按照与以前相同的思路,我们将为空名称错误处理创建一个新测试。

再次,Xcode显示shownEmptyNameErrorMessage属性的错误。 在将此变量添加到演示者后,将可以运行测试。 但是,它一直在失败。 发生这种情况是因为空电子邮件的错误行为仍未更改。 因此,有必要回到用例并进行适当的更改以解决此问题。

现在,Xcode显示有关不存在的failureEmptyNamefaiulreEmptyEmail方法的错误。 在尝试使用这些编译错误运行测试之后,有必要创建预期的方法。

所有错误处理方案均与上述相同。 对剩余的每个场景重复所有这些步骤,将使这篇文章变得很大,因此克隆存储库以检查所有不同的情况是绝对必要的。 接下来,我们需要解决另一个重要的部分,负责将输入数据传递到相邻层。 将来将替换该层以进行BASS集成,并且如果没有该层,则无法将数据持久存储在Cloud Service中。

此层中的软件是一组适配器,可以将数据从对用例和实体最方便的格式转换为对某些外部机构(如数据库或Web)最方便的格式。 例如,正是这一层将完全包含GUI的MVC架构。 演示者,视图和控制器都属于此处
马丁,罗伯特。 “清洁建筑” 2012

认证网关

要对外部世界说“嗨!”,我们将采用与演示者相同的方法,但是这次使用的是一个名为Gateway的人,该人也被注入到用例中。 您可以在下面检查完整的测试用例。

您可以在其余情况以及所有“测试双打”实施中看到相同的TDD心态。

用户实体

用户实体将是一个用于低谷层的对象。 为此,除了电子邮件和标识符外,用户还必须具有名称和生日。

实体可以是带有方法的对象,也可以是一组数据结构和功能……这些实体是应用程序的业务对象。 它们封装了最通用和最高级的规则。
马丁,罗伯特。 “清洁建筑” 2012

👥实体

下一篇文章将讨论使用云服务的真实网关的实现细节及其相应的测试。 不要忘记在Github页面⭐️上关注项目。

附:如果您喜欢这篇文章,请在Twitter上分享,或在中级推荐,或两者都=)。 这确实有助于我吸引更多人。 非常感谢 ..

    Interesting Posts