Sponsor Link
環境&対象
- macOS14.5
- Xcode 16 Beta
- iOS 17.5
- Swift 5.9
Beta 版で動作確認してます。
XCTestExpectation を使用するテスト
Swift Testing 以前の環境(= XCTest) では、call-back 等のイベントが期待通りに発生したかどうかの確認には、XCTestExpectation を使用していました。
以下のように、操作によって、XCTestExpectation が fullfill() されることを待ちます。
fulfill() されれば 正常として判定され、されなければエラーと判定されます。
@MainActor
func test_init_MarkdownFile_fromString() async throws {
let expectation = XCTestExpectation(description: "objectDidChange")
var cancellables: Set<AnyCancellable> = Set()
let sut = XXX()
sut.objectDidChange.sink { change in
expectation.fulfill()
}.store(in: &cancellables)
sut.modifySomething() // this should trigger objectDidChange
await fulfillment(of: [expectation], timeout: 3)
XCTAssertEqual(sut.something, anything)
}
(このときにも、fulfillment で待つパターンと wait で待つパターンがありますが、この記事でのメイントピックではありません。)
上記のように、XCTestExpectation を使用して、ある操作の結果として イベントが発生していることを確認したいケースがありました。
しかし、Swift Testing では、XCTestExpectation は使えません。
厳密には、XCTestExpectation は、Swift Testing でも使用することは可能ですが、XCTestCase を継承することで使用できるようになっていた fulfillment や wait を使用することができません。
Confirmation を使用するテスト
Swift Testing では、confirmation / Confirmation という仕組み(?) が用意されています。
参考
confirmation(_:expectedCount:fileID:filePath:line:column:_:)Apple Developer Documentation
参考
ConfirmationApple Developer Documentation
@MainActor
func test_init_MarkdownFile_fromString() async throws {
var cancellables: Set<AnyCancellable> = Set()
let sut = await confirmation("comment", expectedCount: 1, { event in
let sut = XXX()
sut.objectDidChange.sink { change in
event.confirm(count: 1)
}.store(in: &cancellables)
sut.modifySomething() // this should trigger objectDidChange
return sut // return sut for further test
})
XCTAssertEqual(sut.something, anything)
}
confirmation に与える body には、Confirmation が引数として与えられてきます。
この body 内で、expectedCount に指定された回数 .confirm されるかをテストします。
confirmation からの返り値は、body からの返り値です。このとき、すでに、expectedCount 回 confirm されているはずなので、完了した状態でのテストを行うことが可能です。
当然ですが、body 内で expectedCount 回 confirm されない場合はエラーになります。
まとめ
イベント発生をテストする
- XCTestCase の XCTestExpectation/ fulfillment/ wait 相当は、Swift Testing では、Confirmation/ confirmation
- fulfill の呼び出しは、confirm を呼び出しに相当
- Swift Testing では、fulfillment / wait は使用できない
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
SwiftUI おすすめ本
SwiftUI を理解するには、以下の本がおすすめです。
SwiftUI ViewMatery
SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。
英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。
View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。
超便利です
販売元のページは、こちらです。
SwiftUI 徹底入門
# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。
Swift学習におすすめの本
詳解Swift
Swift の学習には、詳解 Swift という書籍が、おすすめです。
著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。
最新版を購入するのがおすすめです。
現時点では、上記の Swift 5 に対応した第5版が最新版です。
Sponsor Link