UISlider addTarget和sendActions在UT中不起作用

Guy*_*her 3 unit-testing ios xctest swift

当我在标准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)")
}
Run Code Online (Sandbox Code Playgroud)

现在由于某种原因,当我想在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)")
}
Run Code Online (Sandbox Code Playgroud)

sliderTouch()在UT情况下永远不会调用它,根据我的理解,sendActions不是asnyc,应该直接调用操作方法。

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

编辑:我还需要它来为其它的UIKit控件,如工作UISwitchUISegmentedControlUIDatePicker等...

nag*_*rrr 7

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

这是Apple文档的摘录:

当发生控件特定的事件时,控件立即调用任何关联的操作方法。动作方法是通过当前的UIApplication对象调度的,该对象在响应者链中根据需要找到合适的对象来处理消息。

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

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

另请参阅这篇文章

更新:

这是设置主机应用程序的方法

Xcode屏幕截图

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

完成后,您的测试现在应该可以进行了。没有其他步骤。