How to test wether a function in Swift 2.0 throws or not? How to assert that the correct ErrorType
is thrown?
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 } }
At least of Xcode 7.3 (maybe earlier) you could use built-in XCTAssertThrowsError()
:
XCTAssertThrowsError(try methodThatThrows())
If nothing is thrown during test you'll see something like this:
If you want to check if thrown error is of some concrete type, you could use errorHandler
parameter of 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) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With