2014-06-05 5 views
17

के साथ स्विफ्ट यूनिट परीक्षण स्विफ्ट भाषा यूनिट परीक्षणों में अपवाद फेंकने के लिए कोई समकक्ष है?XCTAssertThrows एनालॉग

class Square : NSObject{ 

    let sideLength: Int 

    init(sideLength: Int) { 
     assert(sideLength >= 0, "Wrong initialization of Square class with below zero side length") 
     self.sideLength = sideLength 
     super.init() 
    } 
} 

और टेस्ट यह काम की जांच करने के:

उदाहरण के लिए मैं एक वर्ग है। उद्देश्य सी में मैं इस तरह की टेस्ट विधि लिख सकता हूं:

- (void)testInitializationWithWrongSideLengthThrowsExceptions{ 
    XCTAssertThrows([[Shape alloc] initWithSideLength: -50], "Should throw exceptions on wrong side values initialisations"); 
} 

स्विफ्ट बराबर तकनीकी क्या है?

+3

@Vignesh कुमार: कृपया बस पूरी तरह स्विफ्ट सवाल retagging बंद करो। आप मदद नहीं कर रहे हैं बिलकुल। निश्चित रूप से – BoltClock

उत्तर

2

आप अपने परीक्षण के लिए निम्न तीन फाइलों को जोड़ते हैं:

// ThrowsToBool.h 
#import <Foundation/Foundation.h> 

/// A 'pure' closure; has no arguments, returns nothing. 
typedef void (^VoidBlock)(void); 

/// Returns: true if the block throws an `NSException`, otherwise false 
BOOL throwsToBool(VoidBlock block); 


// ThrowsToBool.m 
#import "ThrowsToBool.h" 

BOOL throwsToBool(VoidBlock const block) { 
    @try { 
     block(); 
    } 
    @catch (NSException * const notUsed) { 
     return YES; 
    } 
    return NO; 
} 


// xxxTests-Bridging-Header.h 
#import "ThrowsToBool.h" 

तो फिर तुम लिख सकते हैं:

XCTAssert(throwsToBool { 
    // test code that throws an NSException 
}) 

लेकिन यह ज़ोर या पूर्व शर्त :(

पी एस मैं से विचार आया के लिए काम नहीं करता: http://modocache.io/xctest-the-good-parts

2

मुझे लगता है कि assert() -फंक्शन केवल डीबग-प्रयोजनों के लिए उपयोग किया जाना चाहिए। इतना ही नहीं से एप्पल के स्विफ्ट-बुक निम्नलिखित बयान (https://itun.es/de/jEUH0.l) की वजह से: "। इस प्रकार के दावे को समाप्त करने के अपने अनुप्रयोग के कारण और इस तरह से कि अवैध स्थिति पैदा होती है की संभावना नहीं है में अपने कोड को डिजाइन करने के लिए एक विकल्प नहीं हैं"

यही कारण है कि मैं इस का समाधान देंगी:

import Cocoa 
import XCTest 

class Square 
{ 
    let sideLength: Int 

    init(_ sideLength: Int) 
    { 
     self.sideLength = sideLength >= 0 ? sideLength : 0 
    } 
} 

class SquareTests: XCTestCase 
{ 
    override func setUp() { super.setUp() } 
    override func tearDown() { super.tearDown() } 

    func testMySquareSideLength() { 
     let square1 = Square(1); 
     XCTAssert(square1.sideLength == 1, "Sidelength should be 1") 

     let square2 = Square(-1); 
     XCTAssert(square2.sideLength >= 0, "Sidelength should be not negative") 
    } 
} 

let tester = SquareTests() 
tester.testMySquareSideLength() 
+0

चाहिए। –

0

वहाँ तेज में XCTAssertThrows करने के लिए कोई बराबर है। अभी के लिए आप मूल कार्य का उपयोग नहीं कर सकते हैं, लेकिन कुछ उद्देश्य-सी सहायता के साथ एक समाधान है। आप त्वरित, या केवल नुकीले का उपयोग कर सकते हैं। या अपने खुद के ज़ोर समारोह बनाने के लिए - http://modocache.io/xctest-the-good-parts - - यह लेख देखें संभावित सुधार # 2: स्विफ्ट को XCTAssertThrows जोड़े

0

सही तरीका:

class Square : NSObject{ 

    let sideLength: Int 

    init(sideLength: Int) throws { // throwable initializer 
     guard sideLength >= 0 else { // use guard statement 
      throw ...// your custom error type 
     } 

     self.sideLength = sideLength 
     super.init() 
    } 
} 

और परीक्षण:

func testInitThrows() { 
     do { 
      _ = try Square(sideLength: -1) // or without parameter name depending on Swift version 
      XCTFail() 
     } catch ... { // your custom error type 

     } catch { 
      XCTFail() 
     } 
    } 
संबंधित मुद्दे