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控件,如工作UISwitch,UISegmentedControl,UIDatePicker等...
在测试Framework目标中包含的类时,我遇到了与您类似的问题。
这是Apple文档的摘录:
当发生控件特定的事件时,控件立即调用任何关联的操作方法。动作方法是通过当前的UIApplication对象调度的,该对象在响应者链中根据需要找到合适的对象来处理消息。
在框架中测试类时,没有UIApplication对象,因此无法调度事件。
您可以在测试目标设置中添加主机应用程序。如果没有主机应用程序,则可以创建一个空的iOS应用程序并使用它。
另请参阅这篇文章。
更新:
这是设置主机应用程序的方法:
如果下拉列表中没有应用程序,则只需创建一个新目标并使用应用程序 > 单视图应用程序模板。
完成后,您的测试现在应该可以进行了。没有其他步骤。
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |