アサーションについて
期待値 と 実際の値 を比較する専用のメソッドのことを アサーションメソッド もしくは単に アサーション と呼ぶ。
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として一時的に実行対象外にする機能がすでに存在する。