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

时间:2014-06-30 21:42:11

标签: swift nsinvocation

我试图在Swift中创建一个可重用的测试工具,并认为子类将扩展测试工具以提供测试中的实例,并且可以添加他们自己的子类特定的测试方法,如下所示: / p>

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的testrunner尝试运行FooPrimeTests时,它不会调用no-arg 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

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

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

实际上我认为这是很正常的,因为你的FooPrimeTests只是子类化XCTestCase,它有不同的init,如:

init!(invocation: NSInvocation!)

init!(selector: Selector)

init()

可能当你发布了你的问题时,你正在运行旧版本的Swift,(我目前正在Xcode Beta 6.2上运行它),这就是你无法看到错误的原因。但是,我再说一遍,如果我说得对,你的类FooPrimeTests就不能看到你的自定义初始化器只是因为它是XCTestCase,而不是FooTestHarness。哪个是定义init(instance: Foo)的类。

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