2017-07-04 17 views
0

我有在照片库中保存图片的应用程序的功能。一个我不知道如何测试这个代码:XCTests和PHPhotoLibrary

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.cameraOutput是和UIImage和某事出了错并且在completionHandler一个错误,所以我在self.unsucessfullSavingOperation(error)结束了方法。这当然有单独的测试,但我想盖:

确保每当事情会出错,在相机胶卷中插入图像我最终会调用这个方法

当我尝试在测试目标中调用saveInPhotoGallery()它会产生警告,这需要访问您的照片库(doh!)。但有一种方法可以跳过此警报单元测试或检查无论它弹出并按允许? (就像我说的,为了这个测试,让我们假设我有这个权限)

还是有办法模拟这种行为?

回答

1

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

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

让我知道你是否需要更多的细节来打破依赖关系,或者制作模拟对象,或者两者兼而有之。

+0

谢谢,很明显,但不知道是否真的值得这样做,因为模拟对象可以返回错误,成功,假设我将测试'self.unsucessfullSavingOperation(error)',并且与成功操作相同。自从我测试函数来分别处理所有可能的输出后,仍然有一点嘲笑。 – Kuba

+0

因此,您已经有'unsupportedSullSavingOperation'的单元测试?在这种情况下,嘲笑会让你更高级地处理这些测试。这会在测试中带来'saveInPhotoGallery',这会让你安全地重构它。它也会使'unsuccessfullSavingOperation'成为一个隐藏的实现细节。 –

相关问题