【发布时间】:2017-02-12 13:19:13
【问题描述】:
我有一个实现自定义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?也许我们需要以某种方式强制运行循环?
编辑 1: 请注意,由于我正在测试一个库,我的测试目标没有任何主机应用程序。当测试目标有宿主应用程序时,上述测试通过。
【问题讨论】:
-
这很奇怪,我已将您的代码复制并粘贴到我创建的项目中,并且期望已满,测试成功。
-
刚刚意识到这可能是因为我正在测试一个库。当我使用主机应用程序创建另一个测试目标时,上面的测试通过了。 @WilsonBalderrama
标签: ios swift selector xctest nsrunloop