2017-07-04 2 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とSTHが間違っていたとエラーがcompletionHandlerであり私はself.unsucessfullSavingOperation(error)で終わったことを、今、私は私の場合のシナリオでテストすることを想定してみましょう:私はこのコードをテストする方法を疑問に思います方法。これは当然の別々のテストを持っていますが、私がカバーしたいことは次のとおりです。

は何かがカメラロールに画像を挿入するとうまくいかなかったときはいつでも、私は私がしようとすると、この方法

呼び出すとなってしまいますことを確認してくださいテスト対象のsaveInPhotoGallery()に電話すると、フォトライブラリへのアクセスが必要であるという警告が表示されます(doh!)。しかし、このアラートをスキップしてユニットテストに入れるか、またはそれを確認してを入力してを許可しますか? (私が言ったように、このテストでは、私にこのパーミッションがあると仮定しましょう)

これを模擬する方法がありますか?

答えて

1

はい、私はPHPhotoLibraryを模倣したいと思います。あなたが置き換える必要がある主なものは、具体的なインスタンスへの依存関係を作成するPHPhotoLibrary.shared()の使用です。その代わりに、抽象化、つまりプロトコルに依存することができます。

生産コードは、使用するインスタンスとしてPHPhotoLibrary.shared()を提供できます。テストコードはモックオブジェクトを供給することができます。

依存関係を解読したり、モックオブジェクトを作成したり、その両方をより詳細にする必要があるかどうかを教えてください。

+0

モックオブジェクトがエラーを返す可能性があるので、これは本当に価値があるのだろうかと疑問に思っています。成功すると、私は 'self.unsucessfullSavingOperation(error)'をテストし、成功した操作で同じことを試してみましょう。私はfuncsをテストして、可能なすべての出力を個別に処理するので、まだ嘲笑の点はありますか? – Kuba

+0

あなたはすでに 'unsucessfullSavingOperation'の単体テストをしていますか?その場合、嘲笑は一段階高いそれらのテストを扱うことができます。これにより、テスト中に 'saveInPhotoGallery'が呼び出され、安全にリファクタリングすることができます。また、 'unsucessfullSavingOperation'に隠れた実装の詳細を作るでしょう。 –

関連する問題