8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

XCTUnwrapを使ってUnitTestのunwrapをすっきり書く

Last updated at Posted at 2021-05-10

概要

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のスコープで行っている「XCTFailreturn」など
  • 一行で済むのでコードが簡潔になる
8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?