使用R.swift和Sourcery为IBOutlet生成测试

R.swift及其替代品是在更短的时间内编写更安全代码的绝佳方法。 它在基于情节提要的项目中特别有效,可以节省大量工作。 如果您的项目中没有用于资源的任何代码生成器,我建议您考虑添加一个。

安装和设置后,您可以使用生成的代码访问笔尖中的视图:

还不错,不是吗? 我们的项目非常有力地保证现在仅使用现有资源。 但是我们不能确定是否使用连接到某物的插座。

在开发过程中没什么大不了的。 生产呢?

没问题。 让我们编写一些单元测试。

还有更多测试

到了某个时候,我们肯定会遇到另一端的问题-不再需要某些出口,因此将它们删除了,我们必须调整单元测试。

相当重复无聊的工作。 我们有更好的选择,也许还有更好的消磨时间的方式,而不是支持我们的测试,因此-完全放弃!


更长的选择是使用Sourcery自动生成它们。

安装非常简单,但是正如这里提到的,使用brew获得新版本目前并不容易。 我下载了最新版本并将其直接添加到项目中。 之后,就可以使用了。

在R.swift的帮助下,我们已经为我们提取了所有视图。 我们唯一需要的是一个实际的测试模板。

Sourcery当前支持Swift,Stencil和JavaScript。 我坚持使用第二个,发现它非常方便并且得到了很好的支持。

用于为我们的xib生成测试的模板如下所示:

我们要做的仅有两件事-遍历所有属性并找到我们的出口。 在拥有所有数据之后。 从我们的模板中:

  {method.returnType.variables%中的变量所占的百分比} 
{%为variable.attributes中的属性,其中attribute ==“ IBOutlet”和variable.typeName | hasSuffix:“!” %}

接下来,我们将进行由{{staticXibVar.name}}{{variable.name}}组成的特定测试。

  XCTAssertNotNil(R.nib。{{staticXibVar.name}}。firstView(owner:nil)!。{{variable.name}}) 

现在,我们准备将所有测试放入XCTestCase中并添加到项目中。

在我的情况下,结果如下所示:

import,class和func都在模板的内部,我跳过了它们以使其更短。

同样,我创建了第二个用于检查情节提要的模板:

查看控制器测试

核心思想是相同的,主要问题是实际了解在哪里寻找特定类型和变量。 同样,为了使R.swift能够找到您的视图控制器,您必须为其添加Storyboard ID


元编程对我来说是个新主意,有很多功能可以发现。 如果您有一个很好的用法示例以及一些问题,请发表评论或在LinkedIn或Facebook上与我联系


可以在此处找到示例项目。

如果您喜欢这篇文章-给它一些鼓掌👏🙂