模拟初始viewController - 代码覆盖率结果

时间:2016-04-15 02:37:14

标签: ios xcode swift unit-testing

我遇到了问题,即使经过几个小时的尝试和错误以及谷歌搜索和堆栈溢出,我也不知道解决方案。

我有一个视图控制器。我想通过依赖注入传递一个对象。该对象源自协议。通常,设置单元测试不是问题。还有模拟工作和单元测试正在运行。那么问题出在哪里?

我只在主要目标中测试一个班级。这个类与视图控制器完全无关。但代码覆盖率显示我覆盖视图控制器的百分比值。过了一会儿,我发现当我进入"测试"按钮项目执行就像我按下"运行"按钮。因此,视图控制器被初始化并创建,我没有机会首先传递另一个依赖项,或者在测试执行之前。

所以我需要一种方法来区分测试运行和实际运行,在一种情况下传递一个真实对象,在另一种情况下传递虚假对象。

我的问题是,如何做到这一点?我想知道为什么没有人有这个问题。我的意思是,如果它向我显示方法已被覆盖,即使我还没有对它们进行测试,那么它给了我代码覆盖率工具。

我正在测试的唯一一门课程:

The one and only class that I am testing

这些是覆盖结果(条形图只是灰色,因为Xcode在截图期间失去焦点。否则它们是蓝色的。):

enter image description here

所以我期待在结果中看到我正在测试的类而不是其他所有内容。我知道为什么这个问题仍然存在。视图控制器具有依赖关系,并且在初始化之后该依赖关系会创建更多类,依此类推。我想做的是在单元测试期间传递假对象,在实际运行期间传递真实对象。就像它在Visual Studio中用于非ui测试一样:如果执行测试,则应用程序不会启动。测试运行者只是初始化测试中的主题,这就是全部。这就是我想要为iOS单元测试实现的目标。我想我已经错过了......非常重要:(

1 个答案:

答案 0 :(得分:0)

对于我们所有有或将会遇到同样问题的人。解决方案是为测试运行指定环境变量。之后,您可以使用这样的代码检查您是否正在运行单元测试(假设您创建了一个名为“InTestMode”的环境变量,并在测试运行期间将值设置为“1”:

       let dict = NSProcessInfo.processInfo().environment

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

        return false
相关问题