2014-06-30 10 views
8

alır bir başlatıcı geçersiz kılma Alt sınıflar, sınama altında örnek sağlamak için test kablo demetini genişletecek ve kendi alt sınıfı özel bir sınama ekleyebilirsiniz fikrini kullanarak yeniden kullanılabilir bir test kablo takımı oluşturmaya çalışıyorum yöntemler, böyle bir şey:Swift: Bir NSInvocation

Ancak
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 en testrunner FooPrimeTests çalıştırmayı denediğinde, bu no-arg init() çağırmaz, bu init(invocation: NSInvocation!) çağırır (ve bir olmadığından başarısız).

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

ve FooPrimeTests yılında: Ben FooTestHarness bu geçersiz kılmak için çalıştı

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

ama bu mesajın 'NSInvocation' is unavailable başarısız olur.

Bir çözüm var mı?

+1

Aynı sorunu yaşıyorum! – Andy

+0

Bir geçici çözüm olarak, belki de nesnenizi alay etmeye çalışabilirsiniz. Init çağrısını yeniden yönlendirebileceksiniz. – Pintouch

cevap

1

Ben doğru anladım emin os, ama sen gibi bir derleyici hatası almalısınız önerdi denetimi kodu değilim: herhalde aslında enter image description here

oldukça normaldir senin FooPrimeTests sadece XCTestCase sınıflara beri Eğer Swift eski bir sürümü çalıştırdığınız sen soruyu, (Şu anda Xcode Beta 6.2 üzerine koşuyorum) neden gidebildiğini olduğunu yayınlanmıştır Muhtemelen

init!(invocation: NSInvocation!) 

init!(selector: Selector) 

init() 

: hangi gibi farklı init var Hatayı gör. Ama, ve ben, eğer doğru noktanızı alırsam tekrar söylerim ki, FooPrimeTests sınıfınız, XCTestCase'i değil, daha sonra FooTestHarness'i alt etmek için özel başlatıcıyı göremez. init(instance: Foo)'un tanımlandığı sınıf hangisidir. Bu nedenle FooTestHarness alt sınıfı olarak FooPrimeTests tanımlamak isteyebilirsiniz. Bu şekilde başlatıcınızı doğru şekilde görebilmeniz gerekir. Umarım bu yardım.