【问题标题】:Swift: XCTest Class 'FirstDemoTests' has no initializersSwift:XCTest 类“FirstDemoTests”没有初始化器
【发布时间】:2018-07-25 14:48:58
【问题描述】:

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

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 类中使用 init() 会有问题吗?
我正在使用 Swift 4、Xcode 9.2。

【问题讨论】:

    标签: ios swift xctest xctestcase


    【解决方案1】:

    编写 XCTest 时无需编写初始化程序。

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

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

    class MyTests: XCTestCase {
    
        var viewController: ViewController!
    
    }
    

    在您的每个 XCTestCase 类中始终覆盖以下 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()
        }
    

    【讨论】:

    • 很好的答案,我只是删除“将设置代码放在这里”剩余的 Apple 评论。
    【解决方案2】:

    我了解您希望避免隐式展开,但不幸的是(除非您想自己编写测试运行程序),您无法控制在运行测试时调用哪个初始化程序.

    如您所知,您可以通过隐式展开并在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()
        }()
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多