Swift:XCTest类“ FirstDemoTests”没有初始化程序

use*_*482 4 ios xctest swift xctestcase

我有以下代码(试图避免隐式展开):

class MyTests: XCTestCase {

    var viewController: ViewController

}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

Class 'MyTests' has no initializers
Run Code Online (Sandbox Code Playgroud)

我解决了这个问题:

class MyTests: XCTestCase {

    var viewController: ViewController

    override init() {
        self.viewController = ViewController()
        super.init()
    }
}
Run Code Online (Sandbox Code Playgroud)

init()在XCTest类中使用会出现问题吗?
我正在使用Swift 4,Xcode 9.2。

Ole*_*tha 6

我知道您想避免隐式解包,但是不幸的是(除非您想编写自己的测试运行器而麻烦),您无法控制在运行测试时调用哪个初始化程序。

如您所知,您可以通过隐式解包并在中设置属性的值来解决此问题,该属性的值setUp()在每次测试之前都会被调用,因此可以确保在测试期间该属性不会为零。这样比较安全。

class MyTests: XCTestCase {

    var viewController: ViewController!

    override function setUp() {
        super.setUp()
        self.viewController = ViewController()
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,您可以设置属性lazy,这意味着不必隐式地对其进行包装。这意味着该属性不必在对象初始化期间初始化,因此您无需编写新的初始化程序,而是在首次访问该属性时进行初始化。

class MyTests: XCTestCase {

    lazy var viewController: ViewController = {
        return ViewController()
    }()
}
Run Code Online (Sandbox Code Playgroud)