我应该如何测试findByAttribute
我添加到的实例方法NSManagedObject
?
起初,我想以编程方式创建一个独立的 Core Data 堆栈,如 Xcode 的 Core Data Utility Tutorial 所示。而且,在我搜索该文档时,我遇到了Core Data Fetch Request Templates并认为可能不是创建我创建的方法,而是我应该制作 fetch 请求模板,但它看起来不像entityName
可以通过 fetch 变量请求模板,可以吗?我可以创建一个获取请求模板,NSManagedObject
以便所有子类都可以使用它吗?嗯,但是我仍然需要一个entityName
并且我认为没有办法动态获取调用该方法的子类的名称。
无论如何,看起来一个很好的解决方案是创建一个用于测试的内存中核心数据堆栈,独立于生产核心数据堆栈。@Jeff Schilling 还建议创建一个内存持久存储。Chris Hanson 还创建了一个持久存储协调器来对 Core Data 进行单元测试。这似乎类似于 Rails 有一个单独的数据库进行测试。但是,@iamleeg 建议删除 Core Data 依赖项。
您认为哪种方法更好?我个人更喜欢后者。
更新:我正在使用 OCHamcrest 和 Pivotal Lab 的 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
然后你得到奖励积分!:)如果论点应该是an ,我似乎不必将 anNSNumber
转换为 an因为是 an ,对吗?id
id
NSNumber
id