iOS为什么单元测试类调用ViewController

Sab*_*aba 4 unit-testing ios xctest swift

我写了如下的单元测试:

class Test445Tests: XCTestCase {
    func testPerformanceExample() {
        XCTAssert(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

测试运行时,将调用ViewController.viewDidLoad!有人可以解释为什么会这样吗?

class ViewController: UIViewController {

    static var s = false

    override func viewDidLoad() {
        super.viewDidLoad()
        ViewController.s = true // put the debugger here.
    }


}
Run Code Online (Sandbox Code Playgroud)

如果编写此代码并将调试器放在ViewController上,则可以检查该调试器将在该行上停止。

rob*_*off 6

ViewController之所以创建实例,是因为您的应用ViewController在启动时创建了一个,并且您的测试包将您的应用用作其“主机应用”:

主机应用程序设置

当配置如上所示进行配置时,这意味着Xcode通过启动主机应用程序,然后将测试包注入其中,来运行测试包中的测试。

您可以将“主机应用程序”设置更改为“无”:

主机应用程序设置为无

当设置配置为“无”时,Xcode使用称为XCTest代理的非GUI应用程序运行测试包,并且不会启动您的应用程序,因此您的应用程序没有机会创建ViewController

请注意,当您将“主机应用程序”设置为“无”时,您的测试包将无法再访问该应用程序中定义的任何API。您要测试的所有API,都必须进入框架,并将测试包与该框架链接(在测试包的“构建阶段”选项卡中)。

还要注意,即使将“主机应用程序”设置为“无”,Xcode仍会启动模拟器。您的测试用例被允许使用仅在模拟器运行时才可用的iOS系统服务,并且Xcode事先不知道您的测试用例是否需要这些服务。因此,以防万一,它必须首先启动模拟器。