2015-02-07 83 views
0

我想寫一個測試,驗證我的場景中SKSpriteNode具有正確的紋理。 測試看起來像這樣:無法可靠驗證SKSpriteNode的紋理

let sceneSprite = scene.childNodeWithName("sceneSprite") as SKSpriteNode! 

let sprite = SKSpriteNode(imageNamed: expectedSpriteTexture) 
sprite.size = sceneSprite.size // 102.4 x 136.533 

XCTAssertTrue(sceneSprite.texture!.sameAs(sprite.texture!), "Scene sprite has wrong texture") 

爲SKTexture的sameAs的方法具有以下擴展名來實現:

extension SKTexture { 
    func sameAs(texture: SKTexture) -> Bool { 
     return self.image.sameAs(texture.image) 
    } 

    var image: UIImage { 
     let view = SKView(frame:CGRectMake(0, 0, size().width, size().height)) 
     let scene = SKScene(size: size()) 
     let sprite = SKSpriteNode(texture: self) 
     sprite.position = CGPoint(x: CGRectGetMidX(view.frame), y: CGRectGetMidY(view.frame)) 
     scene.addChild(sprite) 
     view.presentScene(scene) 
     return self.imageWithView(view) 
    } 

    func imageWithView(view: UIView) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0) 
     view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

extension UIImage { 
    func sameAs(image: UIImage) -> Bool { 
     let firstData = UIImagePNGRepresentation(self); 
     let secondData = UIImagePNGRepresentation(image); 
     return firstData.isEqual(secondData) 
    } 
} 

的問題是有時測試通過,有時測試失敗。我更改了代碼,以便保存失敗的圖像,並發現測試失敗,因爲即使第一個圖像是正確的,第二個圖像也完全是黑色。 可以做些什麼以便測試可靠地通過? 這個故障發生在iPad2的模擬器上。

回答

0

我做了如下改變,它似乎使測試通過可靠

func imageWithView(view: UIView) -> UIImage { 
    UIGraphicsBeginImageContext(view.bounds.size) 
    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: false) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 

中,人們對爲什麼這使得一些想法測試成功?

+0

看起來像我錯了。測試通過兩幅圖像上方的變化的原因現在完全是白色的。 – 2015-02-08 01:29:53