branch10480’s blog

Topics that I've learned.

iOSアプリ開発自動テストの教科書 を読んでいく 〜 10 〜

アサーションについて

期待値実際の値 を比較する専用のメソッドのことを アサーションメソッド もしくは単に アサーション と呼ぶ。

e.g.

XCTAssertTrue(expr)

expr は『式』を意味する expression の省略形。

等値性判定(Swift)

XCTAssertEqual(Equatable, Equatable)
XCTAssertNotEqual(Equatable, Equatable)

等値性判定(Objective-C)

XCTAssertEqualObjects(expr1, expr2)
XCTAssertNotEqualObjects(expr1, expr2)

NSObjectを継承したオブジェクトはこちらのメソッドを使う必要がある点に注意!

間違えてSwift側のXCTAssertEqual(expr1, expr2)を使うと、ポインタアドレスが一致するかの判定になってしまう。

Swiftにてオブジェクトの参照が等しいことを検証するには?

XCTAssertTrue(object1 === object2)

意図的に失敗させる

XCTFail()

注意!
XCTFail()は処理を中断するわけではない。止めたい場合は明示的にreturnを記述する。

func testMethod() {
    executeClosure(true) {
        XCTFail()
        return      // 処理をここで中断する
    }
    
    // return によりここのコードは実行されない
    XCTAssertTrue(false)
}

例外を判定する

XCTAssertThrowsError(expr, errorHandler)
XCTAssertNoThrow(expr)

errorHandler を使わない場合の書き方は以下。

// throwError()で例外をスローすることを期待
XCTAssertThrowsError(try thowError())

// noThrowError()が何も例外をスローしないことを期待
XCTAssertNoThrow(try noThrowError())

例外をスローする可能性があるメソッド呼び出しなので、tryをつけることを忘れない。

次に、第2引数errorHandlerを使うパターン。
例外の種類まで判定したい場合に第2引数を用いる。

enum DownloadError: Error {
    case connectionError
    case unknownError(code: Int)
}

func downloadContent() throws { // 例外をスローする可能性あり

    // ダウンロード処理
    
    // コネクションに失敗した場合、DownloadError.connectionErrorをスロー
    if connectionFailed {
        throw DownloadError.connectionError
    }
    
    // 不明なエラーがあった場合はそれをスロー
    if unknownError {
        throw DownloadError.unknownError
    }
}

こちらに対し、テストを行う。

XCTAssertThrowsError(try downloadContent()) { error in
    XCTAssertEqual(error as? DownloadError, DownlaodError.connectionError)
}

Tips: 一時的にテスト実行対象から外す方法

メソッド名をtestから始まらないように変更してしまう。

func xtestAdd() { }

ちなみに、Quick/NimbleではAPIとして一時的に実行対象外にする機能がすでに存在する。

> 次回に続く