gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:10 25 4
gpt4 key购买 nike

出于以下几个原因,我想在 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 的新并行测试功能和排序更改。

关于ios - 无法覆盖 Swift XCTestCase 中的 init() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com