2016-04-15 58 views
-1

我有一个问题,我不知道,甚至几个小时的尝试和错误,谷歌搜索和stackoverflowing后的解决方案。模拟最初的viewController - 代码覆盖率结果

我有一个视图控制器。我想通过每个依赖注入一个对象。该对象来自协议。一般来说,设置单元测试不是问题。还有嘲笑作品和单元测试正在运行。那么问题在哪里?

我在我的主要目标测试只有一个类。这个类与视图控制器完全无关。但代码覆盖率显示了覆盖视图控制器的体面百分比值。过了一段时间后,我发现当我点击“测试”按钮时,项目被执行,就像我按下“运行”按钮一样。因为视图控制器被初始化和创建,我没有机会首先传递另一个依赖,或者在测试执行之前。

所以我需要的方法的测试运行和实际运行之间进行区分,在一种情况下的真实物体和在另一种情况下的假对象传递。

而我的问题是,如何去?我想知道为什么没有人有这个问题。我的意思是,如果代码覆盖工具向我展示了即使我没有测试过这些方法,也会给我提供代码覆盖工具。

唯一的一个类,我测试:

The one and only class that I am testing

而这些都是覆盖率结果(酒吧仅有灰色,因为Xcode中失去截图中的焦点,否则他们是蓝色。):

enter image description here

所以我期待看到覆盖的结果只是类我测试,而不是一切。我知道为什么这个问题依然存在。视图控制器有一个依赖关系,并且这个依赖关系在被初始化后会创建更多的类,等等。我想要做的是在单元测试期间传递一个假对象,并在实际运行过程中传递一个真实对象。就像它在Visual Studio中的非UI测试一样:如果执行测试,应用程序不会启动。测试运行者只是初始化测试对象,就这些。这就是我想为iOS单元测试实现的目标。我想我错过了某事。很重要的:(

回答

0

对于我们所有人来说谁都有或将有同样的问题。解决的办法是测试运行指定的环境变量。之后,你可以检查您是否有这样的代码运行单元测试(假设您已创建一个名为“InTestMode”的环境变量,并在测试运行期间将该值设置为“1”:

 let dict = NSProcessInfo.processInfo().environment 

     if let env = dict["InTestMode"] as? String? 
     { 
      return env == "1" 
     } 

     return false