J'ai une bibliothèque implémentant un UIControl
personnalisé avec une méthode qui déclencherait un événement .valueChanged
lorsqu'il est appelé. Je voudrais tester la méthode pour ce comportement.Comment tester si un UIControlEvents a été déclenché
Mon contrôle personnalisé:
class MyControl: UIControl {
func fire() {
sendActions(for: .valueChanged)
}
}
Et le test:
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)
}
}
}
Le problème est la méthode observe
obtient jamais appelé si le expectation
n'est pas remplie.
La question est: comment pouvons-nous tester pour UIControlEvents
comme dans ce cas? Peut-être que nous devons forcer le runloop en quelque sorte?
EDIT 1: Veuillez noter que depuis que je teste une bibliothèque, ma cible de test ne possède aucune application hôte. Le test ci-dessus passe lorsque la cible de test a une application hôte.
c'est bizarre J'ai copié et collé votre code dans un projet que j'ai créé et l'attente est complète, test réussi. – Wilson
Je me suis rendu compte que c'était parce que je suis en train de tester une bibliothèque. Lorsque je crée une autre cible de test avec une application hôte, le test ci-dessus passe. @WilsonBalderrama –