How to unit test throwing functions in Swift?

前端 未结 5 660
暗喜
暗喜 2021-02-01 12:56

How to test wether a function in Swift 2.0 throws or not? How to assert that the correct ErrorType is thrown?

5条回答
  •  别跟我提以往
    2021-02-01 13:36

    EDIT: Updated the code for Swift 4.1 (still valid with Swift 5.2)

    Here's the latest Swift version of Fyodor Volchyok's answer who used XCTAssertThrowsError:

        enum MyError: Error {
            case someExpectedError
            case someUnexpectedError
        }
    
        func functionThatThrows() throws {
            throw MyError.someExpectedError
        }
    
        func testFunctionThatThrows() {
            XCTAssertThrowsError(try functionThatThrows()) { error in
                XCTAssertEqual(error as! MyError, MyError.someExpectedError)
            }
        }
    

    If your Error enum has associated values, you can either have your Error enum conform to Equatable, or use the if case statement:

        enum MyError: Error, Equatable {
            case someExpectedError
            case someUnexpectedError
            case associatedValueError(value: Int)
        }
    
        func functionThatThrows() throws {
            throw MyError.associatedValueError(value: 10)
        }
    
        // Equatable pattern: simplest solution if you have a simple associated value that can be tested inside 1 XCTAssertEqual
        func testFunctionThatThrows() {
            XCTAssertThrowsError(try functionThatThrows()) { error in
                XCTAssertEqual(error as! MyError, MyError.associatedValueError(value: 10))
            }
        }
    
        // if case pattern: useful if you have one or more associated values more or less complex (struct, classes...)
        func testFunctionThatThrows() {
            XCTAssertThrowsError(try functionThatThrows()) { error in
                guard case MyError.associatedValueError(let value) = error else {
                    return XCTFail()
                }
    
                XCTAssertEqual(value, 10)
                // if you have several values or if they require more complex tests, you can do it here
            }
        }
    

提交回复
热议问题