呼び出されたときにイベントUIControl
を発生させるメソッドを使用してカスタムを実装するライブラリがあります.valueChanged
。その動作についてメソッドをテストしたいと思います。
私のカスタムコントロール:
class MyControl: UIControl {
func fire() {
sendActions(for: .valueChanged)
}
}
そしてテスト:
import XCTest
class ControlEventObserver: NSObject {
var expectation: XCTestExpectation!
init(expectation anExpectation: XCTestExpectation) {
expectation = anExpectation
}
func observe() {
expectation.fulfill()
}
}
class Tests: XCTestCase {
func test() {
let myExpectation = expectation(description: "event fired")
let observer = ControlEventObserver(expectation: myExpectation)
let control = MyControl()
control.addTarget(observer, action: #selector(ControlEventObserver.observe), for: .valueChanged)
control.fire()
waitForExpectations(timeout: 1) { error in
XCTAssertNil(error)
}
}
}
問題は、observe
メソッドが呼び出されないため、expectation
が実行されないことです。
問題はUIControlEvents
、この場合のようにどのようにテストできるかということです。おそらく、なんとかしてrunloopを強制する必要がありますか?
編集1:ライブラリをテストしているため、テストターゲットにホストアプリケーションがないことに注意してください。上記のテストは、テストターゲットにホストアプリケーションがある場合に合格します。
UIControlに関するAppleのドキュメントには、次のように記載されています。
コントロール固有のイベントが発生すると、コントロールは関連するアクションメソッドをすぐに呼び出します。アクションメソッドは、現在のUIApplicationオブジェクトを介してディスパッチされます。このオブジェクトは、必要に応じてレスポンダーチェーンに従って、メッセージを処理するための適切なオブジェクトを見つけます。
ときsendActions(for:)
Uicontrolの上と呼ばれ、コントロールが呼び出されますUIApplication
さんをsendAction(_:to:from:for:)
登録対象にイベントを提供します。
ホストアプリケーションなしでライブラリをテストしているので、UIApplication
オブジェクトはありません。したがって、.valueChanged
イベントはディスパッチされず、observe
メソッドは呼び出されません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加