ios*_*ude 5 unit-testing uiviewcontroller ios
我怎么能在iOS应用程序中对我的视图控制器(UIViewController子类)进行单元测试?
在过去的几天里,我一直在广泛搜索这个主题,但我仍然无法理解这样做的正确方法.
似乎至少有三种单元测试视图控制器逻辑的方法:
公开要进行单元测试的私有操作和IBOutlet(在头文件中声明它们).
使用类别,例如Tests,从单元测试中访问私有操作和IBOutlet.
不要暴露任何东西,而是通过标题或其他公共属性查找按钮和其他视图,并通过公共UIView方法模拟用户交互(例如模拟用户点击按钮); 然后观察可见状态.
我没有在这个上找到很多资源,但objc.io上有一个例子.
现在,说实话,我真的不喜欢前两个,因为据我所知,单元测试不应该测试对象的内部(即私有方法),并且仅仅为了测试而宣布它们是公开的喜欢最好的做法.我通常将IBActions和IBOutlets保留在实现中,但现在我突然只能将所有内容公开,因为我正在添加测试...
我认为可能还有另一种选择:从我的视图控制器中移动尽可能多的逻辑到独立组件并测试它们(让控制器未经测试或大部分未经测试).这似乎是一个不错的主意,但我将不得不进行大量的重构(我目前正在为一个未编入测试的项目添加单元测试).
所以我想知道,测试视图控制器的最佳方法是什么?
这个问题可能主要是基于意见的,应该关闭,但无论如何我都会发表一些我的意见。
IBAction并且IBOutlet不是真正的私有方法/属性。您可以将它们声明为私有方法/属性,但从概念上讲,它们是视图控制器的公共接口。它们是交流观点的方式。因此,我更喜欢第二种方式,使用类别(如 )UI从单元测试中访问私有操作和 IBOutlet。
我完全反对第三种单元测试方法。因为根据定义,您正在编写集成测试而不是单元测试。它严重依赖实现细节并且很容易崩溃。您可能需要其中一些,但您应该首先完成单元测试。
正如您已经知道的,真正的解决方案是重构代码以使它们可测试。理想情况下,控制器应该非常小,并且仅充当视图和模型之间的绑定。如果你有非常大的控制器,你应该将 UI 逻辑重构为视图/视图模型,将业务逻辑重构为模型/模型助手。