Swift version: 5.6
When writing tests, it’s common to want to unwrap an optional before checking it for a particular value. XCTUnwrap()
does exactly that for us: it attempts to unwrap the optional, but will throw an error (and thus fail the test) if the optional is nil.
For example, if you have a User
struct with a getAuthenticationToken()
method that returns an optional string, you can use XCTUnwrap()
like this:
func testTokenGenerationSucceeds() throws {
let user = User()
let token = try XCTUnwrap(user.getAuthenticationToken())
XCTAssertEqual(token.count, 40)
}
That test is marked with throws
, which allows us to call XCTUnwrap()
and propagate any errors if it finds our optional is empty.
This approach is cleaner than what we might have written previously:
func testTokenGenerationSucceeds2() {
let user = User()
if let token = user.getAuthenticationToken() {
XCTAssertEqual(token.count, 40)
} else {
XCTFail("Failed to generate valid token.")
}
}
It’s worth adding that in trivial cases such as this one, it’s possible to compare optionals with non-optionals in less code, like this:
func testTokenGenerationSucceeds3() throws {
let user = User()
XCTAssertEqual(user.getAuthenticationToken()?.count, 40)
}
However, things aren’t so straightforward when you need to work with optional chaining in a longer test – that’s really where XCTUnwrap()
will come into its own.
TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Available from iOS 13.0
This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.
Link copied to your pasteboard.