ios - XCTests 和 PHPhotoLibrary

标签 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 中有错误 所以我最终进入了 self.unsucessfullSavingOperation(error) 方法。这当然有单独的测试,但我想介绍的是:

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

当我尝试在测试目标中调用 saveInPhotoGallery() 时,它会发出警告,提示这需要访问您的照片库(doh!)。但是有一种方法可以在 单元测试 中跳过此警报,或者检查它弹出的任何内容并按 allow 吗? (就像我说的,对于这个测试,我们假设我有这个权限)

或者有办法模拟这种行为吗?

最佳答案

是的,我会 mock PHPhotoLibrary。您需要替换的主要内容是您对 PHPhotoLibrary.shared() 的使用,它创建了对具体实例的依赖。相反,我们可以依赖一个抽象,即协议(protocol)。

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

如果您需要更多关于打破依赖性或制作模拟对象或两者的详细说明,请告诉我。

关于ios - XCTests 和 PHPhotoLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44902889/

相关文章:

arrays - 在快速机器学习中分配数组无法将类型 '[[String]]' 的值分配给类型 'String?'

ios - Objective-C 应用程序中缺少 Swift 框架中的 IBOutlet 属性

ios - Xcode UI 测试 : how to identify a custom view with no static text?

xcode - 本地化未加载到XCTest中吗?

ios - 隐藏在滚动/滑动后,UINavigationBar 不会再次显示

ios - 如何将 GPUImageAlphaBlendFilter 添加到 GPUImageFilterGroup

ios - 相机屏幕仅显示空白的黑色图像

ios - 我可以在应用程序(应用程序关闭时)、iOS、Swift 的后台使用 Firebase 操作吗

swift - 找到一个数的所有因子的最有效方法?

xcode - Xcode7 | Xcode UI测试|如何处理位置服务警报?