Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView.animateWithDuration:动画:完成:在XCTest中被取消_Ios_Swift_Animation_Uiview_Xctest - Fatal编程技术网

Ios UIView.animateWithDuration:动画:完成:在XCTest中被取消

Ios UIView.animateWithDuration:动画:完成:在XCTest中被取消,ios,swift,animation,uiview,xctest,Ios,Swift,Animation,Uiview,Xctest,我正在尝试对UIView上的扩展进行单元测试,该扩展调用animateWithDuration:animations:completion: 不幸的是,测试用例中的所有动画都会立即取消,因此完成块的isFinished参数总是false 有人知道如何让动画在测试用例中工作吗 这是我的游乐场代码: 导入UIKit 导入测试 扩展UIView{ 功能淡出(持续时间:时间间隔,完成时间:((Bool)->Void)?){ UIView.animate(withDuration:duration, 动画

我正在尝试对
UIView
上的扩展进行单元测试,该扩展调用
animateWithDuration:animations:completion:

不幸的是,测试用例中的所有动画都会立即取消,因此完成块的
isFinished
参数总是
false

有人知道如何让动画在测试用例中工作吗

这是我的游乐场代码:

导入UIKit
导入测试
扩展UIView{
功能淡出(持续时间:时间间隔,完成时间:((Bool)->Void)?){
UIView.animate(withDuration:duration,
动画:{
self.alpha=0.0
},
完成:{isFinished in
self.ishiden=isFinished
完成?(isFinished)
})
}
}
类UIViewTests:XCTestCase{
func testFadeView(){
//给定
让expection=self.expection(描述:“期望调用完成处理程序”)
let view=UIView()
view.alpha=1.0
//什么时候
打印(“日期之前”,日期())
视图.淡出(持续时间:1.0){(已完成)在
打印(“完成日期”,日期())
打印(“isFinished”,isFinished)
期望实现
}
//然后
等待(等待:[预期],超时:1.1)

xctasertrue(view.ishiden)/要使用正确的标志完成动画,需要在可见的UI窗口中显示视图

let window = UIWindow()
window.addSubview(view)
window.isHidden = false
这样,您的测试就成功了。但是如果在测试的最后不给运行循环一个额外的提示,UIKit将无法清理窗口。所以添加

func tearDown() {
    super.tearDown()
    RunLoop.current.run(until: Date())
}
然后窗口(以及其中的任何内容)将被释放


现在它工作了,你可以通过缩短持续时间来节省时间。我通过使用
持续时间:0.001

将测试时间缩短到23毫秒。请共享代码抱歉,我添加了一个游乐场示例,因此根据你之前的描述:你的实际测试不是调用animate,对吗?而是调用你的扩展?很难从代码中分辨出来e您添加了。是的,我已将代码从扩展直接复制到测试用例,以使其更简单。基本上,我希望看到您要测试的代码。非常感谢您的帮助!视图似乎必须附加到当前可见的
UIWindow
,才能使动画正常工作。``let window=UIWindow()window.makeKeyAndVisible()让view=UIView()window.addSubview(view)``也起作用。无论如何,我不想创建第二个键窗口,所以我选择了UIApplication.shared.keyWindow(选项较少)相反。再次感谢你的帮助:)很好的跟进。我将用你的信息更新我的答案,这样对其他读者来说更容易。
func tearDown() {
    super.tearDown()
    RunLoop.current.run(until: Date())
}