ios - UISlider addTarget 和 sendActions 在 UT 中不起作用

标签 ios swift unit-testing xctest

当我在标准 MVC 项目中运行此代码时,一切正常:我可以通过编程方式将操作发送到我的 UISlider。

override func viewDidLoad() {
    super.viewDidLoad()        
    slider = UISlider(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
    slider.minimumValue = 1
    slider.maximumValue = 100
    slider.addTarget(self, action: #selector(sliderTouch), for: .touchUpInside)
    slider.sendActions(for: .touchUpInside)
}

func sliderTouch(sender: UISlider) {
    print("value: \(sender.value)")
}

现在由于某种原因,当我想在我的 UT 中模拟 Slider 行为时,它不起作用。这是代码:

func testSlider() {
    let slider = UISlider(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
    slider.minimumValue = 1
    slider.maximumValue = 100
    slider.addTarget(self, action: #selector(sliderTouch), for: .touchUpInside)
    slider.sendActions(for: .touchUpInside)
}

func sliderTouch(sender: UISlider) {
    print("value: \(sender.value)")
}

sliderTouch() 从未在 UT 案例中被调用,据我了解,sendActions 不是 asnyc,应该直接调用操作方法。

那么为什么我会出现这种行为,我该如何解决呢?

编辑:我还需要它来处理其他 UIKit 控件,例如 UISwitchUISegmentedControlUIDatePicker等等……

最佳答案

在测试框架目标中包含的类时,我遇到了与您类似的问题。

这是来自 Apple's documentation 的摘录:

When a control-specific event occurs, the control calls any associated action methods right away. Action methods are dispatched through the current UIApplication object, which finds an appropriate object to handle the message, following the responder chain if needed.

当测试框架中的类时,没有 UIApplication 对象,因此无法调度事件。

您可以在测试目标设置中添加主机应用程序。如果您没有宿主应用程序,您可以创建一个空的 iOS 应用程序并使用它。

另见 this post .

更新:

以下是设置Host Application的方法:

Xcode Screenshot

如果下拉列表中没有应用程序,只需创建一个新目标并使用应用程序> 单 View 应用程序 模板。

你已经完成了,你的测试现在应该可以工作了。没有额外的步骤。

关于ios - UISlider addTarget 和 sendActions 在 UT 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073648/

相关文章:

ios - 如何更改导航栏按钮之间的距离

ios - Swift - PanGesture 识别器 - 随物体移动 - 移动速度

swift - 如何限制按时间快速点击的按钮

json - 将 JSON 数据解析为 Swift 时遇到问题

ios - 如何在 UITableView 中启用/禁用滚动?

unit-testing - 如何在不使用 Visual Studio 的情况下启用代码覆盖率?

javascript - AngularJS 类型错误 : 'undefined' is not an object' Jasmine test

ios - 如何查找我的 mac 中是否安装了 cocoaPods

ios - "isnan"似乎不起作用

unit-testing - 如何在 angularjs 单元测试中触发 keyup/keydown 事件?