2015-09-30 21 views

Trả lời

25

Dưới đây là t ông Swift 3 phiên bản của Fyodor Volchyok's answer người sử dụng XCTAssertThrowsError:

enum MyError: Error { 
     case someExpectedError 
     case someUnexpectedError 
    } 

    func functionThatThrows() throws { 
     throw MyError.someExpectedError 
    } 

    XCTAssertThrowsError(try functionThatThrows()) { error in 
     XCTAssertEqual(error as? MyError, MyError.someExpectedError) 
    } 

Ngoài ra, nếu Error enum bạn đã liên kết các giá trị, lưu ý bạn sẽ phải sử dụng câu lệnh if case (hoặc làm enum của bạn phù hợp với Equatable nhưng đó sẽ là mã thêm không cần thiết để viết):

enum MyError: Error { 
     case someExpectedError 
     case someUnexpectedError 
     case associatedValueError(value: Int) 
    } 

    func functionThatThrows() throws { 
     throw MyError.associatedValueError(10) 
    } 

    XCTAssertThrowsError(try functionThatThrows()) { error in 
     guard case MyError.associatedValueError(let value) = error else { 
      return XCTFail() 
     } 

     XCTAssertEqual(value, 10) 
    } 
11

Với các chức năng sau đây và tuyên bố:

enum SomeError: ErrorType { 
    case FifthError 
    case FirstError 
} 

func throwingFunction(x: Int) throws { 
    switch x { 
    case 1: 
     throw SomeError.FirstError 
    case 5: 
     throw SomeError.FifthError 
    default: 
     return 
    } 
} 

Chức năng này sẽ ném một FifthError nếu 5 được trao cho các chức năng và FirstError nếu 1 được đưa ra.

Để kiểm tra, đó là một chức năng chạy thành công các đơn vị kiểm tra có thể xem xét như sau:

func testNotError() { 
    guard let _ = try? throwingFunction(2) else { 
     XCTFail("Error thrown") 
     return 
    } 
} 

Các let _ cũng có thể được thay thế bằng bất kỳ tên nào khác, vì vậy bạn có thể tiếp tục kiểm tra đầu ra.

Để khẳng định rằng một chức năng ném, không có vấn đề gì ErrorType các đơn vị kiểm tra có thể trông như thế này:

func testError() { 
    if let _ = try? throwingFunction(5) { 
     XCTFail("No error thrown") 
     return 
    } 
} 

Nếu bạn muốn kiểm tra cho một cụ thể ErrorType nó được thực hiện với một -statement do-catch. Đây không phải là cách tốt nhất so với các ngôn ngữ khác.

Bạn phải chắc chắn rằng bạn ...

  • return trong catch cho đúng ErrorType
  • XCTFail()return cho tất cả khác catch
  • XCTFail() nếu không catch được thực hiện

Với yêu cầu này, thử nghiệm ca se có thể trông giống như sau:

func testFifthError() { 
    do { 
     try throwingFunction(5) 
    } catch SomeError.FifthError { 
     return 
    } catch { 
     XCTFail("Wrong error thrown") 
     return 
    } 
    XCTFail("No error thrown") 
} 
+0

Tôi tin rằng sẽ có ý nghĩa hơn khi sử dụng phương pháp XCTAssertThrowsError như Fyodor Volchyok đã đề xuất. –

11

Ít nhất là Xcode 7.3 (có thể sớm hơn), bạn có thể sử dụng built-in XCTAssertThrowsError():

XCTAssertThrowsError(try methodThatThrows()) 

Nếu không có gì được ném trong quá trình thử bạn sẽ thấy một cái gì đó như thế này:

enter image description here

Nếu bạn muốn kiểm tra nếu ném lỗi là của một số loại bê tông, bạn có thể sử dụng errorHandler tham số của XCTAssertThrowsError():

enum Error: ErrorType { 
     case SomeExpectedError 
     case SomeUnexpectedError 
    } 

    func functionThatThrows() throws { 
     throw Error.SomeExpectedError 
    } 

    XCTAssertThrowsError(try functionThatThrows(), "some message") { (error) in 
     XCTAssertEqual(error as? Error, Error.SomeExpectedError) 
    } 
Các vấn đề liên quan