2016-04-18 13 views
5

स्विफ्ट विधियों के लिए परीक्षण कैसे लिखते हैं जिनके पास पूर्व शर्त है?पूर्व शर्त के साथ परीक्षण स्विफ्ट कोड

func doublePositive(n:Int) -> Int { 
    precondition(n >= 0) 
    return 2*n 
} 

XCTAssertThrowsError का उपयोग करना काम नहीं करता है:

थ्रेड 1:

func testDoublePositive() { 
    XCTAssertEqual(10, testObject.doublePositive(5)) // Works 
    XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks 
} 

यह जब परीक्षण चलाने में कोई त्रुटि उत्पन्न करता है यहाँ एक उदाहरण है EXEC_BAD_INSTRUCTION (कोड = EXCI386_INVOP, subcode = 0x0)

क्या पूर्वोत्तर परीक्षण करने का कोई तरीका है स्विफ्ट के tions?

+2

पूर्व शर्त में विफलता को पकड़ने का कोई मानक तरीका नहीं है, यह हमेशा कार्यक्रम को रोक देगा, हालांकि कुछ बदलाव हैं, http://www.cocoawithlove.com/blog/2016/02/02 पर एक नज़र डालें /partial-functions-part-two-catching-precondition-failures.html – ogres

+0

@ogres वाह, यह एक अच्छा लेख है, धन्यवाद! – dasblinkenlight

+0

मैं इसे गैर-परीक्षण कोड में देखने के लिए प्रतीक्षा नहीं कर सकता। मुझे खुशी है कि यह परीक्षण करने की कोशिश कर रहा है कि आप परीक्षण करने की कोशिश कर रहे हैं, लेकिन मुझे उस वेबसाइट से नफरत है ... क्योंकि मैं गारंटी देता हूं कि कोई इसे अपने मुख्य लक्ष्य में कार्यान्वित कर रहा है और ऐप को दुर्घटनाग्रस्त होने से रोकने के लिए अस्थिर धागे को अनाथ कर रहा है ... (और मैं यह कहता हूं, क्योंकि मैंने देखा है कि यह उनके समान उद्देश्य-सी आलेख के लिए होता है ...) – nhgrif

उत्तर

3

आप उन स्विफ्ट विधियों का परीक्षण करते हैं जिनके पास केवल पूर्व शर्त के इनपुट वाले इनपुट के साथ परीक्षण व्यवहार करके पूर्व शर्त होती है। जब पूर्व शर्त पूरी नहीं होती है तो व्यवहार बिना किसी परीक्षण के स्पष्ट होता है, क्योंकि मानक पुस्तकालय में पूर्व शर्त लगाई जाती है।

यदि आपको संदेह है कि आपने सटीक रूप से एक पूर्व शर्त निर्दिष्ट की है, तो आप पूर्व शर्त अभिव्यक्ति को एक बूलियन फ़ंक्शन में खींच सकते हैं, फिर परीक्षण करें कि अमान्य इनपुट से सही ढंग से समझने योग्य है।

हालांकि, आप खुद के लिए बना सकते हैं आप यहाँ के लिए क्या चाहते हैं:

एक विकल्प पूर्व शर्त/अभिकथन विफलताओं पर अपवाद उत्पन्न करने के लिए चाल करना होगा: डिबग बनाता है में एक इसे चालू होता है, और इसे चालू रिलीज में बंद बनाता है।

इसके बजाय एप्पल के precondition, आप अपने खुद के समारोह में लिख सकते हैं बुलाने की

, का कहना है कि require। जैसा कि आप चाहें कार्य करने के लिए इसे सशर्त रूप से संकलित किया जा सकता है। इसके बाद आप इसका हर जगह उपयोग करेंगे, अन्यथा आप precondition का उपयोग कर रहे होंगे।

+0

अपना खुद का कार्य बनाना एक अच्छा विचार है, धन्यवाद! – dasblinkenlight

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