2014-06-05 6 views
17

Gibt es eine Entsprechung für das Auslösen von Ausnahmen in schnellen Sprach-Unit-Tests?Swift-Unit-Test mit XCTAssertThrows analog

Zum Beispiel habe ich eine Klasse:

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() 
    } 
} 

und testen Sie es überprüfen arbeiten. In Objektiv C kann ich eine Testmethode wie folgt schreiben:

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

Was ist Swift equal technic?

+3

@Vignesh Kumar: Bitte nur Swift Fragen aufhören mit neuen Tags versehen zusammen. Du hilfst nicht. Überhaupt. – BoltClock

Antwort

2

Wenn Sie fügen Sie die folgenden drei Dateien in Ihre Tests:

// 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" 

Dann können Sie schreiben:

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

Aber es funktioniert nicht für assert oder Voraussetzung :(

PS ich auf die Idee kam von: http://modocache.io/xctest-the-good-parts

2

Ich denke, die assert()-Funktion sollte nur für Debug-Zwecke verwendet werden. Nicht nur wegen der folgenden Aussage aus Apples Swift-Book:

"Behauptungen verursachen Ihre App zu beenden und sind kein Ersatz für die Gestaltung Ihres Codes in einer Weise, dass ungültige Bedingungen unwahrscheinlich sind."

das ist, warum ich würde dieses Problem lösen, wie folgt:

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

sollte es natürlich sein. –

0

Es gibt keine äquivalent zu XCTAssertThrows in swift ist. Momentan können Sie keine native Funktion verwenden, aber es gibt eine Lösung mit einer objektiven Hilfe. Sie können Quick oder nur Flinke verwenden. Oder Ihre eigene Funktion assert zu machen - in diesem Artikel - http://modocache.io/xctest-the-good-parts - Potential Entwicklung # 2: Fügen Sie XCTAssertThrows zu Swift

0

richtige Weg in Swift 2:

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() 
    } 
} 

und Prüfung:

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

     } catch { 
      XCTFail() 
     } 
    }