2016-10-25 15 views
0

私はSwift 2.2で書かれた自分のプロジェクトの単体テストを書こうとしています。そのプロジェクトの一部はカスタムクラスLocalStorageManagerです。これはNSFileManagerを使用してファイルIO操作を実行し、残りのアプリケーションがアクセスするための非常に簡単なファイルのやりとりを公開します。私のテストでは実際のファイルを作成したくないので、NSFileManagerをモックする必要があります。私は何かを試してきましたが、私はそれが気に入らないのです。 iOSでシステムライブラリを模擬する方法Mockingライブラリを使用しないSwift?

は、私は次の形式でモッククラスを書いた:

import Foundation 

class MockNSFileManager: NSFileManager { 

    override init() { 
     // do nothings master!! 
    } 

    override func createFileAtPath(path: String, contents data: NSData?, attributes attr: [String : AnyObject]?) -> Bool { 
     print("file mock created") 
     return true 
    } 

    override func fileExistsAtPath(path: String, isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool { 
     print("does the file exists?") 
     return false 
    } 

    override func fileExistsAtPath(path: String) -> Bool { 
     print("the file exists") 
     return true 
    } 

    override func createDirectoryAtPath(path: String, withIntermediateDirectories createIntermediates: Bool, attributes: [String : AnyObject]?) throws { 
     print("successfully maybe...") 
    } 

    override func contentsAtPath(path: String) -> NSData? { 
     print("returning some fancy contents") 
     return NSData() 
    } 

    override func removeItemAtPath(path: String) throws { 
     print("removing item at the path") 
    } 
} 

LocalStorageManagerでは、私は私のユニットテストでinit(fileManager: NSFileManager)

を実現し、私はLocalStorage(fileManager: MockNSFileManager())としてのlocalStorageを初期化します。

すべてがうまくいっていて、期待通りです。しかし、私はテストコードが私のアプリの生産コードをどのように侵略しているのか気に入らない。 LocalStorageクラスでは、私のアプリで実行する必要がないときに、私がinitを実装する必要があるのが好きではありません。

私は、実際にテストコードがメインのアプリケーションコードに侵入することなく、テストを容易にするために私のカスタムクラスにモックシステムライブラリを挿入できるようにする方法を模索しています。

答えて

0

私はこの問題を解決しました。 LocalStorageクラスIでは、以前はイニシャライザでNSFileManagerをfileMgr = NSFileManager()としてインスタンス化していました。私はinit(fileManager: NSFileManager)として初期化子を変更し、NSFileManagerインスタンスをfileMgrに割り当てました。コード全体でLocalStorage()への呼び出しをLocalStorage(NSFileManager())に置き換えなければなりませんでした。今テストでは、LocalStorage(MockNSFileManager())のような模擬NSFileManagerでLocalStorageを初期化するだけです。技術的には、MockNSFileManagerが原因MockFileManagerクラスの宣言で

class MockNSFileManager: NSFileManager {

ラインのNSFileManagerあるので、これは動作します。