【发布时间】:2014-10-02 08:06:23
【问题描述】:
我们一直在跟踪我们的项目中的an issue,在该项目中,我们会间歇性地失败快照测试用例。我们方法的要点是渲染视图控制器的视图并将该图像与参考图像进行比较,以查看它们是否不同。我们的方法有几个层次:
我们的问题是有时渲染视图创建的图像是空的。只是一个大的(正确尺寸)透明图像。
我已经单独测试了每一个,并确定这些都不是问题。相反,我已经能够在一个独立的plain Xcode 项目中重现它。
通过使用 FBSnapshotTestCases 用来呈现视图的same approach,我创建了一个简单的测试。要重现,请创建“Master-Detail”模板的新项目,并为详细视图控制器提供“Detail”的 Storyboard ID。然后创建这个简单的单元测试。
func testExample1() {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let sut = storyboard.instantiateViewControllerWithIdentifier("Detail") as UIViewController
sut.beginAppearanceTransition(true, animated: false)
sut.endAppearanceTransition()
UIGraphicsBeginImageContextWithOptions(sut.view.frame.size, false, 0)
sut.view.drawViewHierarchyInRect(sut.view.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
let data = UIImagePNGRepresentation(image)
println("byte length: \(data.length)")
}
没什么太花哨的,它很可能会通过。但是,如果您将代码重复几次:
func testExample1() { ... }
func testExample2() { ... }
func testExample3() { ... }
输出很奇怪(截断):
Test Suite 'All tests' started at 2014-10-02 07:46:52 +0000
byte length: 27760
byte length: 17645
byte length: 27760
Test Suite 'All tests' passed at 2014-10-02 07:55:29 +0000.
Executed 3 tests, with 0 failures (0 unexpected) in 517.778 (517.781) seconds
字节长度应该相同,但事实并非如此。第二个测试(有时是第三个)将有一个空视图,就像我们的问题一样。
here 提供了一个演示该问题的示例项目。
我能够使用 Objective-C 测试项目重现该问题,因此不太可能是 Swift 问题。在过去的项目中,我们没有将 Storyboards 用于我们的视图控制器 UI,因此可能需要一个额外的步骤来“强制”加载视图。这也可能是 Xcode 6.x 或 iOS 8 的问题(我已经重现了 Xcode 6.0.1 的问题)。
有没有人遇到过这样的问题,从 Storyboard 加载的控制器的视图渲染图像是透明的?
【问题讨论】:
标签: xcode uiview uistoryboard