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



我想在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)

init不是XCTestCase的指定初始值设定项。指定的初始值设定项是initWithInvocation:。这需要NSInvocation,这在 Swift 中不可用。执行您所描述的唯一方法是在 ObjC 中。

这没有记录,因为它不受支持。也许有可能实现你所描述的,但它可能会以微妙的方式中断,你应该探索其他解决方案来解决你的问题。

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

我会把你更深层次的目标分解成单独的问题,并询问如何解决它们(你也应该非常清楚地表明你在谈论UI测试;虽然你的代码表明了这一点,但从文本中不清楚(。确保您所描述的内容不会破坏 Xcode 10 的新并行测试功能以及对排序的更改。

最新更新