Sto cercando di creare un'imbracatura di test riutilizzabile in Swift con l'idea che le sottoclassi estenderanno il cablaggio di test per fornire l'istanza in prova e potranno aggiungere il proprio test specifico per sottoclasse metodi, qualcosa di simile:Swift: override di un inizializzatore che accetta NSinvocation
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())
}
}
Tuttavia, quando testrunner di XCode cerca di correre FooPrimeTests
, non chiama il no-arg init()
, si chiama init(invocation: NSInvocation!)
(e fallisce perché non ce n'è uno). Ho cercato di ignorare questo in FooTestHarness
:
init(invocation: NSInvocation!, instance: Foo) {
self.instance = instance
super.init(invocation)
}
e in FooPrimeTests
:
init(invocation: NSInvocation!) {
super.init(invocation, FooPrime())
}
ma questo non riesce con il messaggio 'NSInvocation' is unavailable
.
C'è una soluzione?
Ho lo stesso problema! – Andy
Come soluzione, forse puoi provare a deridere il tuo oggetto. Sarai in grado di reindirizzare la chiamata init. – Pintouch