2017-02-01 13 views
1

私のプロジェクトでコアデータモデルを作ったとしましょう。私はこれらのモデルを取り入れ、そのプロパティに基づいていくつかの機能を実行するメソッドを持つ他のクラスを持っています。どのようにこれらのクラスを単体テストしますか?ユニットテストにコアデータモデルへのアクセスを与える方法

通常のスウィフトファイルでは、Xcodeでそれらを選択し、これらのファイルで定義されたクラスをプロジェクトの単体テスト部分に表示するボックスにチェックを入れます。私の質問は本質的に、私のコアデータモデルをテストにも見えるようにするにはどうすればいいですか?

コアデータスタックで操作を実行したくないことに注意してください。モデルのインスタンスを作成してメソッドに渡したいだけです。

答えて

4

CoreDataは管理オブジェクトを使用するため、NSManagedObjectのサブクラスは、コンテキストに添付されていない限り、機能的に価値がありません。

テストのトリックは、メモリにNSManagedObjectContextを作成し、そのコンテキストを使用してオブジェクトテストを作成することです。 Outlined Here

はここでメモリ内のコンテキストを作成するためのコードです:

func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext { 
    let managedObjectModel = NSManagedObjectModel.mergedModelFromBundles([NSBundle.mainBundle()])! 

    let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel) 

    do { 
     try persistentStoreCoordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil) 
    } catch { 
     print("Adding in-memory persistent store failed") 
    } 

    let managedObjectContext = NSManagedObjectContext() 
    managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator 

    return managedObjectContext 
} 
1

更新:アクセサ実装は実行時に生成されますが、モデルオブジェクトがNSManagedObjectContextに関連付けられていない場合は使用できません。だからPEEJWEEJの答えが行く方法です。

私が間違っていないのであれば、あなたのエンティティ(特にプロパティアクセサー)のObjective-Cクラスは、使用時に実行時に生成されます。だから私は、あなたが適切なNSEntityDescriptionNSManagedObjectの初期化子を呼び出すために必要があるだろうことを期待する:

NSManagedObject(entity: entityDescription, insertInto: nil) 

あなたはNSManagedObjectModelを使用してオブジェクトモデルをロードし、例えば使用して、適切なエンティティの記述を取得することができますそのオブジェクトのentitiesByNameプロパティ。

あなたが(例えばmogeneratorで生成された)あなたのNSManagedObjectサブクラスのカスタムコードを使用している場合は、私は同じプロセスを適用する必要があるだろうと仮定します - あなたのテストに生成されたコードが見えるようにしてMyModelClass(entity: entityDescription, insertInto: nil)初期化子を使用しています。

+0

あなたは間違っている:)あなたは、クラスを自分で作成(またはそれらを生成します)。問題はそれらがManagedObjectsであるため、クラスのプロパティはNSManagedObjectContextに正しく接続されていなければ使用できません。 – PeejWeej

+0

MOC外のプロパティを使用するとどうなりますか? – MrMage

+0

プログラムがクラッシュするか、例外がスローされます。 – PeejWeej

関連する問題