2014-06-30 8 views
8

मैं इस विचार के साथ स्विफ्ट में एक पुन: प्रयोज्य परीक्षण दोहन कि उपवर्गों परीक्षण दोहन का विस्तार होगा परीक्षण के अंतर्गत उदाहरण प्रदान करने के लिए बनाने के लिए कोशिश कर रहा हूँ, और अपने स्वयं के उपवर्ग-विशेष परीक्षा में जोड़ सकते हैं विधियों, कुछ इस तरह:स्विफ्ट: एक प्रारंभकर्ता कि एक 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()) 
    } 

} 

हालांकि, जब XCode के testrunner FooPrimeTests को चलाने के लिए कोशिश करता है, यह कोई आर्ग 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

मुझे एक ही समस्या है! – Andy

+0

एक कामकाज के रूप में, शायद आप अपनी वस्तु का मज़ाक उड़ा सकते हैं। आप इनिट कॉल को रीडायरेक्ट करने में सक्षम होंगे। – Pintouch

उत्तर

1

मुझे यकीन है कि अगर मैं इसे का अधिकार मिल गया ओएस नहीं हूँ, लेकिन कोड आप सुझाव आप की तरह एक संकलक त्रुटि मिलना चाहिए जाँच: enter image description here

कौन वास्तव में मुझे लगता है काफी सामान्य है अपने FooPrimeTests सिर्फ XCTestCase उपवर्गीकरण है के बाद से

init!(invocation: NSInvocation!) 

init!(selector: Selector) 

init() 

शायद जब आप आप कर रहे हैं सवाल आप स्विफ्ट के एक पुराने संस्करण पर चला रहे हैं, (मैं वर्तमान में Xcode बीटा 6.2 पर चल रहा हूँ) है यही कारण है कि आप कर सकते हैं पोस्ट: जो की तरह अलग अलग init मिल गया है त्रुटि नहीं देख रहा हूँ। लेकिन, और मैं फिर से कहूंगा कि अगर मुझे आपकी बात सही हो गई है, तो आपकी कक्षा FooPrimeTests आपको कस्टम प्रारंभकर्ता नहीं देख सकती है क्योंकि XCTestCase को सब्सक्राइज़ करना है, बल्कि FooTestHarness। वह वर्ग कौन सा है जहां init(instance: Foo) परिभाषित किया गया है।

तो शायद आप FooTrimeTests को FooTestHarness के उप-वर्ग के रूप में परिभाषित करना चाहते हैं। इस तरह आप अपने प्रारंभकर्ता को सही ढंग से देखने में सक्षम होना चाहिए। उममीद है कि इससे मदद मिलेगी।

संबंधित मुद्दे