findByAttribute
追加したインスタンスメソッドをNSManagedObject
どのようにテストする必要がありますか?
最初は、XcodeのCore Data Utilityチュートリアルで示されているように、プログラムで独立したCoreDataスタックを作成することを考えました。そして、そのドキュメントを検索したところ、 Core Data Fetch Request Templatesに出くわし、作成したメソッドを作成する代わりに、fetch request templateを作成する必要があると思いましたがentityName
、フェッチを使用して変数を変更できるようには見えません。テンプレートをリクエストできますか?NSManagedObject
すべてのサブクラスがそれを使用できるように、フェッチ要求テンプレートを作成できますか?うーん、でもそれでも必要entityName
で、メソッドを呼び出したサブクラスの名前を動的に取得する方法はないと思います。
とにかく、良い解決策は、本番のCore Dataスタックから独立して、テスト用のメモリ内CoreDataスタックを作成することであるように見えます。@Jeff Schillingは、メモリ内の永続ストアを作成することもお勧めします。Chris Hansonは、CoreDataを単体テストするための永続的なストアコーディネーターも作成します。これは、Railsがテスト用に別個のデータベースを持っている方法と似ているようです。ただし、@ iamleegは、コアデータの依存関係を削除することをお勧めします。
どちらがより良いアプローチだと思いますか?私は個人的に後者を好みます。
更新:私はOCHamcrestとPivotalLabのCedarを使用してコアデータを単体テストしています。以下のコードを書くことに加えて、私はターゲットにNSManagedObject+Additions.m
とを追加しました。User.m
Spec
#define HC_SHORTHAND
#import <Cedar-iPhone/SpecHelper.h>
#import <OCHamcrestIOS/OCHamcrestIOS.h>
#import "NSManagedObject+Additions.h"
#import "User.h"
SPEC_BEGIN(NSManagedObjectAdditionsSpec)
describe(@"NSManagedObject+Additions", ^{
__block NSManagedObjectContext *managedObjectContext;
beforeEach(^{
NSManagedObjectModel *managedObjectModel =
[NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *persistentStoreCoordinator =
[[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:managedObjectModel];
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType
configuration:nil URL:nil options:nil error:NULL];
managedObjectContext = [[NSManagedObjectContext alloc] init];
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
[persistentStoreCoordinator release];
});
it(@"finds first object by attribute value", ^{
// Create a user with an arbitrary Facebook user ID.
NSNumber *fbId = [[NSNumber alloc] initWithInteger:514417];
[[NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:managedObjectContext] setFbId:fbId];
[managedObjectContext save:nil];
NSNumber *fbIdFound = [(User *)[User findByAttribute:@"fbId" value:(id)fbId
entityName:@"User"
inManagedObjectContext:managedObjectContext] fbId];
assertThatInteger([fbId integerValue], equalToInteger([fbIdFound integerValue]));
[fbId release];
});
afterEach(^{
[managedObjectContext release];
});
});
SPEC_END
あなたが私に渡された議論にキャストし(id)
fbId
findByAttribute
ない場合、私が得る理由を教えてくれれば
warning: incompatible Objective-C types 'struct NSNumber *',
expected 'struct NSString *' when passing argument 2 of
'findByAttribute:value:entityName:inManagedObjectContext:' from
distinct Objective-C type
その後、ボーナスポイントを獲得できます!:)引数がであると想定されている場合、私NSNumber
はにをキャストする必要はないようです、そうですか?id
id
NSNumber
id