我想在UI测试中覆盖XCTestCase的init函数,原因如下:
我现在看起来像这样:
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)
答案 0 :(得分:5)
init
不是XCTestCase
的指定初始值设定项。指定的初始值设定项为initWithInvocation:
。这需要NSInvocation
,这在Swift中不可用。做你正在描述的东西的唯一方法是在ObjC。
这是没有记录的,因为它不受支持。有可能实现您所描述的内容,但它可能会以微妙的方式突破,您应该探索解决问题的其他解决方案。
崩溃是ObjC初始化语义的副产品。每个ObjC课程都必须回复init
(因为它继承自NSObject
)。但是,有很多ObjC对象在调用init
时没有正确初始化。 (NSError
对于这个问题有点出名。)唯一知道的方法是通过文档。更复杂的Swift初始化系统试图解决ObjC初始化系统中的问题。
我会将更深层次的目标分解为单独的问题并询问如何解决这些问题(您还应该明确表示您正在谈论UI测试;而您的代码表明,它不是从文中清楚)。确保您所描述的内容不会破坏Xcode 10的新并行测试功能,以及更改订购。