我试图在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
。
有解决方法吗?
答案 0 :(得分:1)
我不确定我是否正确,但检查你建议的代码应该得到一个编译器错误,如:
实际上我认为这是很正常的,因为你的FooPrimeTests只是子类化XCTestCase,它有不同的init,如:
init!(invocation: NSInvocation!)
init!(selector: Selector)
init()
可能当你发布了你的问题时,你正在运行旧版本的Swift,(我目前正在Xcode Beta 6.2上运行它),这就是你无法看到错误的原因。但是,我再说一遍,如果我说得对,你的类FooPrimeTests就不能看到你的自定义初始化器只是因为它是XCTestCase,而不是FooTestHarness。哪个是定义init(instance: Foo)
的类。
因此,您可能希望将FooPrimeTests定义为FooTestHarness的子类。这样你应该能够正确地看到你的初始化器。希望这有帮助。