如何对iOS视图控制器进行单元测试?

时间:2015-11-16 03:59:25

标签: ios unit-testing uiviewcontroller

我应该如何在iOS应用中对我的视图控制器(UIViewController子类)进行单元测试?

过去几天我一直在广泛搜索这个主题,但我仍然无法理解这样做的正确方法。

似乎至少有三种单元测试视图控制器逻辑的方法:

  • 公开要进行单元测试的私有操作和IBOutlet(在头文件中声明它们)。

  • 使用类似Tests的类别来访问单元测试中的私有操作和IBOutlet。

  • 不要公开任何内容,而是通过标题或其他公共属性查找按钮和其他视图,并通过公共UIView方法模拟用户交互(例如模拟用户点击按钮);然后观察可见状态。

    我没有在这个上找到很多来源,但objc.io上有一个例子。

现在,说实话,我真的不喜欢前两个,因为据我所知,单元测试不应该测试对象的内部(即私有方法),并且仅为了测试而宣布它们是公开的看起来似乎是最好的做法。我通常将IBActions和IBOutlets保留在实现中,但现在我突然只能将所有内容公开,因为我正在添加测试......

我认为可能还有另一种选择:尽可能多地从我的视图控制器中移动逻辑到独立组件中并测试它们(让控制器未经测试或大部分未经测试)。这似乎是一个不错的主意,但我将不得不进行大量的重构(我目前正在为一个未编入测试的项目添加单元测试)。

所以我想知道,测试视图控制器的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

这个问题可能主要是基于意见的,应该会被关闭,但无论如何我都会发表一些意见。

IBActionIBOutlet不是真正的私有方法/属性。您可以将它们声明为私有方法/属性,但从概念上讲,它们是视图控制器的公共接口。它们是与视图进行通信的方式。因此,我更喜欢第二种方式,使用类似UI的类别来访问单元测试中的私有操作和IBOutlet。

我完全反对单元测试的第三种方式。因为根据定义,您正在编写集成测试而不是单元测试。它严重依赖于实现细节,可以轻松破解。您可能需要其中一些,但您应该首先完成单元测试。

正如您所知,真正的解决方案是重构代码以使其可测试。理想情况下,控制器应该非常小,仅作为视图和模型之间的绑定。如果你有一个非常大的控制器,你应该将UI逻辑重构为视图/视图模型和业务逻辑到模型/模型助手。

相关问题