教程:如何在iOS应用中对私有方法进行单元测试

在之前的文章中,我提到了一种为私有方法编写单元测试的方法。 你们中的许多人对此可能性感兴趣,并想了解更多。 我认为这将有助于为您提供一个可以遵循的教程,因此请继续。

如果您回想起上一篇文章,我说过微框架是解决此问题的一种方法。 什么是微框架? 没什么特别的,只是导入到主应用程序目标中的一个小框架。

为什么这样做

任何具有内部访问级别的内容都可以在其测试模块的单元测试目标中访问。 然后,将相同的框架导入到主应用程序目标后, 内部实体将无法访问,或者出于所有实际目的变为私有。

如果所有这些听起来像胡言乱语,请不要担心。 让我们通过一个小教程逐步完成它。

入门

继续并从Github获取入门项目。 这里没有什么特别的事情,它只是一个空的单视图应用程序。

由于这是一个有关微框架的教程,因此,我们转到File-> New-> Target来创建一个新框架。

框架是一种目标。 它是一个代码模块,可以导入到另一个标记中,例如您的主应用程序的目标。

停留在iOS上,并一直向下滚动。 选择“ Cocoa Touch Framework”,然后单击下一步。

您将被带到另一个屏幕,您可以在其中命名您的自定义框架。 遵循Apple的命名约定,我选择将其命名为CoreTrick。

选中包含单元测试复选框非常重要 这就是让您为要导入的框架编写单元测试的原因。

单击“完成”,然后在您的项目上单击以再次检查一切是否正常。

如果遵循正确,您将看到一个应用程序目标,一个应用程序目标的单元测试目标,一个框架目标以及该框架目标的另一个单元测试目标。

TrickTrackerTests是TrickTracker的单元测试目标,TrickTracker是主要的应用程序目标。 CoreTrickTests是CoreTrick的单元测试目标,CoreTrick是框架目标,它将包含您要测试的所有实体。

大! 您已经准备好开始编写一些代码。

让我们创建一些内部实体并对其进行测试

通过内部 我只是指与他们相关的访问级别。 函数,变量,类,枚举和结构都可以标记为internal 。 这仅表示这些实体只能在定义它们的模块内访问。 在这种情况下,那就是CoreTrick框架。

我确定您还熟悉其他访问级别。 Public表示可以在模块外部访问实体。 打开意味着它可以在模块外部访问,并且可以被子类覆盖。 私有意味着只能在实体本身的范围内访问它。

单板滑雪特技动作实体

我们的Snowboard Trick Tracker应用程序可跟踪您的滑雪技巧(phe们说快了五倍!)。 它使用具有一些基本属性的简单Snowboard Jump Trick实体。

创建一个名为SnowboardJumpTrick的新Swift文件,并将以下代码粘贴到其中。

我已经说过很多遍了,而且有必要重复一遍。 即使我们为娱乐而制作自己的应用程序,我们每个人都是api设计器。 我们应该以一种无法创建没有任何意义的实体的方式编写代码。

只允许有效的把戏

在这种情况下,让我们介绍一些在创建单板滑雪技巧之前对其进行验证的内容。 我们将添加以下内容。

  1. 失败的初始化器。 这样,如果有人将无效的旋转量传递到Snowboard Jump Trick的初始化程序中,则不会创建Snowboard Jump Trick。 (哇,我猜想类型安全在这个扩展中的含义完全不同)。
  2. 验证程序方法以确保正确的旋转量。 对于滑雪板跳跃技巧,有效旋转是180度的倍数。 另一只脚朝前着陆非常酷。 这就是所谓的开关。

初始化失败

在指定的初始化方法名称之后但在SnowboardJumpTrick上的圆括号之前添加一个问号 这使初始化程序失败

如果您有编写单元测试的经验,那么应该很熟悉。 如果没有,就不用担心。 单元测试用例类使您可以编写一些方法来测试代码。

将文件命名为SnowboardJumpTrickTests。 这遵循约定,即每个测试用例文件应以其测试的类命名。

下一个屏幕非常重要。 您想要验证您的测试用例案例类是否具有CoreTrickTests单元测试目标的成员身份,而不是主应用程序目标的单元测试目标(TrickTrackerTests)的成员身份。

将单元测试绑定到CoreTrickTests目标的好处是能够测试与之关联的内部方法。

完成此操作后,可能会询问您是否要为Objective-C创建桥接头。 无需这样做,因此单击“否”。

如果一切按计划进行,您应该看到一个名为SnowboardJumpTrickTests.swift的文件,其中包含以下空代码模板。

测试应成功✅。 一个绿色的选中标记将出现在您的类和testThatAnyReasonableMultipleOf180IsAValidSpin()方法旁边。

凉! 您有一个成功的框架中实体验证方法。

吃蛋糕也吃

您无需在私有方法和单元测试之间进行选择。 您可以同时拥有。 一探究竟。

TrickTracker应用程序模块中打开ViewController.swift文件,并在导入UIKit的行下方添加以下导入语句。

不用担心 这实际上就是您要寻找的结果。 您只希望在CoreTrick框架及其CoreTrickTests单元测试目标中可以访问验证器方法。

您刚刚完成了不可能的事情。 您为私有方法编写了单元测试。

在编写可测试的代码和创建梦想的界面之间没有选择的必要 。 如果要为私有方法编写单元测试,请采用本应私有的代码,将其移至其自己的框架中,并为其提供内部访问级别。

您将获得可测试的代码,而使用您的框架的人将不知道它们之间的区别。