テストターゲット内のリソースはMainBundleとは別扱い
pathの取得方法(取得先)が違うので注意が必要です。
let path = NSBundle(forClass: self.dynamicType).pathForResource("photo", ofType: "jpg")
追記:Swift3だと下記のようになります。
let path = Bundle(for: type(of: self)).path(forResource: "photo", ofType: "jpg")
非同期のテストについては、waitForExpectationsWithTimeoutを使う
2014年のWWDCに「Testing in Xcode 6」というセッションがあり、その中で Asynchronous testing として説明されています。
https://developer.apple.com/videos/wwdc/2014/#414
let expectation = expectationWithDescription("Save Image from UIImage")
PhotosHelper().saveImageToPhotosLibrary(image) { (success, error) in
XCTAssertTrue(success)
expectation.fulfill()
}
waitForExpectationsWithTimeout(5.0, handler: nil)
XCTAssertThrows等の例外を受けるアサートはなくなった
SwiftにはObjective-Cにはあった例外処理がなくなったので、実装されていないようです。
ググると、Objective-Cをラップした自作アサートの話が出てきました。
http://stackoverflow.com/questions/25529625/testing-assertion-in-swift
こちらも同様なサンプルコードです。
https://gist.github.com/akolov/8894408226dab48d3021
テストの実行は名前順?
手元の環境(Xcode6.4)では、XCTestCaseのサブクラスのクラス名順、さらにクラス内のテストケースも記述順ではなく名前順で実行されていることを確認しました。
- Aテストクラス
- テストケース名前順1
- テストケース名前順2
↓
- Bテストクラス
- テストケース名前順1
- テストケース名前順2
- テストケース名前順3
- テストケース名前順4
↓
- Cテストクラス
- テストケース名前順1
- テストケース名前順2
- テストケース名前順3
のような順で実行されました。