2017-07-04 19 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'成爲一個隱藏的實現細節。 –

相關問題