Невозможно надежно проверить текстуру для 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")

Метод sameAs для SKTexture реализован со следующими расширениями:

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.


person Tron Thomas    schedule 07.02.2015    source источник


Ответы (1)


Я сделал следующее изменение, и кажется, что тест проходит надежно

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

Какие идеи есть у людей, почему это позволяет тесту пройти успешно?

person Tron Thomas    schedule 08.02.2015
comment
Похоже, я был неправ. Причина в том, что тест проходит с изменением выше оба изображения теперь полностью белые. - person Tron Thomas; 08.02.2015