2014-06-30 17 views
8

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?

+1

Ho lo stesso problema! – Andy

+0

Come soluzione, forse puoi provare a deridere il tuo oggetto. Sarai in grado di reindirizzare la chiamata init. – Pintouch

risposta

1

Non sto OS sicuro se ho capito bene, ma controllando il codice che avete suggerito si dovrebbe ottenere un errore di compilazione come: enter image description here

che in realtà mi sa è abbastanza normale in quanto i tuoi FooPrimeTests è solo sottoclasse XCTestCase che ha ottenuto init diverso, come:

init!(invocation: NSInvocation!) 

init!(selector: Selector) 

init() 

Probabilmente quando hai postato Non sei domanda si sta eseguendo una versione precedente di Swift, (sono attualmente in esecuzione sul Xcode Beta 6.2), che è il motivo per cui si può vedo l'errore Ma, e dico di nuovo se ho capito bene, la tua classe FooPrimeTests non può vederti l'inizializzatore personalizzato solo perché sta sottoclassando XCTestCase, piuttosto che FooTestHarness. Qual è la classe in cui è definito lo init(instance: Foo).

Quindi si potrebbe probabilmente voler definire FooPrimeTests come sottoclasse di FooTestHarness. In questo modo dovresti essere in grado di vedere correttamente il tuo inizializzatore. Spero che questo aiuto.

Problemi correlati