XCTests和PHPhotoLibrary

时间:2017-07-04 10:02:58

标签: ios swift xctest xctestcase

我在应用中有功能,可以在照片库中保存图片。我想知道如何测试这段代码:

func saveInPhotoGallery() {
    guard self.cameraOutput != nil else { return }
    if self.cameraOutput is UIImage {
        PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAsset(from: (self.cameraOutput as? UIImage)!)
        }, completionHandler: { (saved, error) in
            guard error == nil else {
               self.unsucessfullSavingOperation(error)
               return
            }
        })
    }
}

我们现在假设我想在我的案例场景中测试self.cameraOutputUIImage并且出错了并且completionHandler中出现错误,所以我最终在{{ 1}}方法。当然,这有单独的测试,但我想要涵盖的是:

确保在相机胶卷中插入图像时出现问题我将最终调用此方法

当我尝试在测试目标中调用self.unsucessfullSavingOperation(error)时,会产生警报,这需要访问您的照片库(doh!)。但是有一种方法可以在单元测试中跳过此警报,或者检查每次弹出窗口并按允许? (就像我说的,对于这个测试,我们假设我有这个权限)

或者有办法模仿这种行为?

1 个答案:

答案 0 :(得分:2)

是的,我嘲笑PHPhotoLibrary。您需要替换的主要内容是使用PHPhotoLibrary.shared()来创建对具体实例的依赖。相反,我们可以依赖抽象,即协议。

然后,生产代码可以提供PHPhotoLibrary.shared()作为要使用的实例。测试代码可以提供模拟对象。

如果您需要更多详细说明打破依赖关系或制作模拟对象,或两者兼而有之,请告诉我。