2015-09-30 9 views

答えて

25

ここでtはです:エラーは、いくつかの具体的なタイプのものであり、あなたはXCTAssertThrowsError()errorHandlerパラメータを使用することができます彼XCTAssertThrowsErrorを使用Fyodor Volchyok's answerSwift 3バージョン:

enum MyError: Error { 
     case someExpectedError 
     case someUnexpectedError 
    } 

    func functionThatThrows() throws { 
     throw MyError.someExpectedError 
    } 

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

また、あなたのError列挙型は、値が関連付けられている場合、あなたはあなたの列挙型がEquatableに準拠if caseステートメントを使用(または作成する必要があります注意してくださいそれは、不必要な余分なコードになります

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

:1が指定されている場合は5が機能してFirstErrorに指定されている場合

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

この関数は、FifthErrorをスローします。

機能が正常に次のようにユニットテストを見ることができる実行されることを、テストするには:

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

let _も他の名前で置き換えることができるので、あなたはさらに出力をテストすることができます。

関係なく、ユニットテストはこのように見えることができるものErrorType、関数がスローすることを主張しないように:あなたはそれがdo-catch -statementで行うの特定ErrorTypeをテストしたい場合は

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

。これは他の言語と比較して最良の方法ではありません。

あなたは何catchが実行されない場合は、他の全てのcatch

  • XCTFail()の正しいErrorType
  • XCTFail()returnためcatch

    • return確認...あなたことを確認する必要があり

    この要件を前提とすると、テストca seは次のようになります。

  • +0

    Fyodor Volchyokが示唆したように、XCTAssertThrowsErrorメソッドを使用する方が理にかなっていると思います。 –

    11

    少なくともXcode 7。3(多分それ以前)を使用すると、使用できるビルトインXCTAssertThrowsError():何もテスト中にスローされない場合、あなたがこのようなものが表示されます

    XCTAssertThrowsError(try methodThatThrows()) 
    

    enter image description here

    あなたが投げているかどうかを確認したい場合

    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) 
        } 
    
    関連する問題