gpt4 book ai didi

Swift:覆盖采用 NSInvocation 的初始化程序

转载 作者:IT王子 更新时间:2023-10-29 05:44:53 28 4
gpt4 key购买 nike

我正在尝试在 Swift 中创建一个可重用的测试工具,子类将扩展测试工具以提供被测实例,并且可以添加它们自己的特定于子类的测试方法,如下所示:

class FooTestHarness: XCTestCase {
let instance: Foo

init(instance: Foo) {
self.instance = instance
}

func testFooBehavior() {
XCTAssert(instance.doesFoo())
}
}

class FooPrime: Foo {
func doesFooPrime(): Bool { /* ... */ }
}

class FooPrimeTests: XCTestCase {

init() {
super.init(FooPrime())
}

func myInstance(): FooPrime {
return instance as FooPrime
}

func testFooPrimeBehavior() {
XCTAssert(myInstance().doesFooPrime())
}

}

但是,当 XCode 的测试运行器尝试运行 FooPrimeTests 时,它不会调用无参数 init(),它会调用 init(invocation: NSInvocation !)(并且失败,因为没有)。我试图在 FooTestHarness 中覆盖它:

  init(invocation: NSInvocation!, instance: Foo) {
self.instance = instance
super.init(invocation)
}

FooPrimeTests 中:

  init(invocation: NSInvocation!) {
super.init(invocation, FooPrime())
}

但这失败并显示消息 'NSInvocation' is unavailable

有解决办法吗?

最佳答案

我不确定我是否做对了,但是检查你建议的代码你应该得到一个编译器错误,比如: enter image description here

实际上我认为这很正常,因为您的 FooPrimeTests 只是 XCTestCase 的子类,它具有不同的初始化,例如:

init!(invocation: NSInvocation!)

init!(selector: Selector)

init()

可能当您发帖时,您会质疑自己在旧版本的 Swift 上运行(我目前在 Xcode Beta 6.2 上运行它),这就是您看不到错误的原因。但是,我再说一遍,如果我的意思是对的,您的类 FooPrimeTests 看不到您的自定义初始化程序,只是因为子类是 XCTestCase,而不是 FooTestHarness。这是定义 init(instance: Foo) 的类。

因此您可能希望将 FooPrimeTests 定义为 FooTestHarness 的子类。这样你应该能够正确地看到你的初始化程序。希望对您有所帮助。

关于Swift:覆盖采用 NSInvocation 的初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24499387/

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