Swift: XCTest Class 'FirstDemoTests' 没有初始化器

Swift: XCTest Class 'FirstDemoTests' has no initializers

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

class MyTests: XCTestCase {

    var viewController: ViewController

}

但我收到以下错误:

Class 'MyTests' has no initializers

我解决了这个问题:

class MyTests: XCTestCase {

    var viewController: ViewController

    override init() {
        self.viewController = ViewController()
        super.init()
    }
}

在 XCTest class 中使用 init() 会有问题吗?
我正在使用 Swift 4,Xcode 9.2.

写 XCTest 时就不需要写初始化程序了。

XCTestCase 提供在执行实际测试之前准备测试项目的方法。

声明 viewController 为显式展开(以避免隐式展开),如下所示。

class MyTests: XCTestCase {

    var viewController: ViewController!

}

总是在您的每个 XCTestCase class.

中重写以下 2 个方法

setUp是在实际测试执行前准备变量。在 setUp.

中初始化 viewController
override func setUp() {
        super.setUp()
        self.viewController = ViewController()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

tearDown是测试完成后释放变量和其他资源。在 tearDown.

发布 viewController
override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class
        self.viewController = nil
        super.tearDown()
    }

我知道你想避免隐式解包,但不幸的是(除非你想经历编写自己的测试的麻烦 运行ner),你无法控制哪个初始化器当测试为 运行.

时调用

如您所知,您可以通过隐式展开并在 setUp() 中设置 属性 的值来解决此问题,它在每次测试之前都会被调用,因此您可以确定 属性 在你的测试中不会是 nil。这样比较安全。

class MyTests: XCTestCase {

    var viewController: ViewController!

    override function setUp() {
        super.setUp()
        self.viewController = ViewController()
    }
}

或者,您可以使 属性 lazy,这意味着它不必隐式解包。这意味着 属性 不必在对象初始化期间进行初始化,因此您无需编写新的初始化程序,但会在第一次访问时进行初始化。

class MyTests: XCTestCase {

    lazy var viewController: ViewController = {
        return ViewController()
    }()
}

实际上,setup() 在每次测试方法调用中调用。

/*!
 * @method -setUp
 * Setup method called before the invocation of each test method in the class.
 */
- (void)setUp;

那么,为什么你需要为当前 XCTests 子类中的 3 个测试方法创建 viewController,比如说 3 次? 您可以尝试在 XCTests 子类之外声明您的变量