Swift: XCTest类'FirstDemoTests'没有初始化器。

10

我有以下代码(试图避免隐式解包):

class MyTests: XCTestCase {

    var viewController: ViewController

}

但是我遇到了以下错误:

Class 'MyTests' has no initializers

我用以下方法来修复:

class MyTests: XCTestCase {

    var viewController: ViewController

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

init()在XCTest类中会有什么问题吗?
我正在使用Swift 4和Xcode 9.2。

(Tips: 该段内容为一个程序员向社区提问,询问在某个特定环境下使用某个方法是否会出现问题)
3个回答

22
我知道您想避免隐式解包,但不幸的是(除非您想麻烦地编写自己的测试运行程序),在运行测试时无法控制调用哪个初始化程序。
您可以通过隐式解包来解决这个问题,并在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()
    }()
}

2

在编写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()
    }

1
很好的回答,我只会删除“在此放置设置代码”的剩余苹果评论。 - Jon Reid

0

实际上,setup() 在每次测试方法调用时都会被调用。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接