[Swift][swift-testing] イベント発生テスト の方法@swift-testing

     
⌛️ < 1 min.

Swift Testing でのイベント発生のテスト方法を確認します。

環境&対象

以下の環境で動作確認を行なっています。

  • 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 されない場合はエラーになります。

まとめ

イベント発生をテストする

イベント発生のテストには confirmation を使用する
  • 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 もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です