无法覆盖Swift XCTestCase中的init()函数

时间:2018-06-08 15:20:03

标签: ios swift xcode xcode-ui-testing

我想在UI测试中覆盖XCTestCase的init函数,原因如下:

  • 在setUp()之外启动应用程序,以便应用程序不需要为每次测试重新启动(这是繁琐且减慢测试的速度)
  • 初始化通过应用程序提供常规导航的其他类,必须使用测试用例( self )进行初始化。

我现在看起来像这样:

import XCTest

class UITest: XCTestCase {

    let app = XCUIApplication()

    // Helper packages
    var helper: UITestHelper!

    override func setUp() {
        super.setUp()

        // Helper package instantiation
        helper = UITestHelper(withTestCase: self, forApp: app)

        continueAfterFailure = false
        app.launch()
    }

... tearDown(), tests ....

我打电话的时候:

override init() {
    super.init()
    foo()
}

我得到Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

1 个答案:

答案 0 :(得分:5)

init不是XCTestCase的指定初始值设定项。指定的初始值设定项为initWithInvocation:。这需要NSInvocation,这在Swift中不可用。做你正在描述的东西的唯一方法是在ObjC。

这是没有记录的,因为它不受支持。有可能实现您所描述的内容,但它可能会以微妙的方式突破,您应该探索解决问题的其他解决方案。

崩溃是ObjC初始化语义的副产品。每个ObjC课程都必须回复init(因为它继承自NSObject)。但是,有很多ObjC对象在调用init时没有正确初始化。 (NSError对于这个问题有点出名。)唯一知道的方法是通过文档。更复杂的Swift初始化系统试图解决ObjC初始化系统中的问题。

我会将更深层次的目标分解为单独的问题并询问如何解决这些问题(您还应该明确表示您正在谈论UI测试;而您的代码表明,它不是从文中清楚)。确保您所描述的内容不会破坏Xcode 10的新并行测试功能,以及更改订购。