概要
Xcode11以降に追加されたXCTUnwrap
を使ってテストコード中のOptional値のunwrapをスッキリ書く方法の紹介です。
XCTUnwrapとは
公式ドキュメントには以下のような記載があります
https://developer.apple.com/documentation/xctest/3380195-xctunwrap
Asserts that an expression is not nil, and returns the unwrapped value.
ざっくり言えば「unwrapとXCTAssertNotNil
」という感じです。
どんなときに有効か
unwrapしたオブジェクトを計算に使いたいケースで有効。
unwrapしたオブジェクトが「nil
であるかどうか」をテストしたいケースには向かない。
以下に具体例。
一般的なUnitTest中のunwrapの書き方(XCTUnwrapを使わない書き方)
func testSample() {
let string = "1"
// 「if let」だとネストが深くなるので「guard let」で書くのが一般的かと思います
guard var number = Int(string) else {
XCTFail() // unwrapできないときはテストを失敗させる
return // 以降の処理を行わせないためにreturn
}
number += 1
XCTAssertEqual(unwrappedNumber, 2)
}
XCTUnwrapを使った書き方
func testSample() throws { // tryで例外を投げる可能性があるのでthrowsが必要
let string = "1"
let number = Int(string)
var unwrappedNumber = try XCTUnwrap(number) // unwrapに失敗したらthrowされるので以降の処理とテストは実施されない
// testSampleのテストはfailureとして処理される
unwrappedNumber += 1
XCTAssertEqual(unwrappedNumber, 2)
}
XCTUnwrapを使った書き方の特徴
- unwrapできないとき例外を投げてテスト失敗になるので、unwrap出来なかったケースを考えなくて済む
- 「一般的な書き方」の
guard ~ else
のスコープで行っている「XCTFail
とreturn
」など
- 「一般的な書き方」の
- 一行で済むのでコードが簡潔になる