但し、CoreDataのテストを行う目的で、NSManagedObject派生クラスへstubを設定する場合には注意が必要です。そのEntityが持つAttributeと紐付いたPropertyをStubにしようとしても実行時エラーになってしまいます。
例えばBookというEntityを作りauthorというAttributeを設定します。このEntityから生成されるBookクラスは次のようなコードになります。
@interface Book : NSManagedObject
@property (nonatomic) NSString *author;
@end
このauthorをStubにしようと、次のようにKiwiのテストケースを書いたとします。it(@"foo", ^{
Book *book = [KWMock mockForClass:[Book class]];
[book stub:@selector(author) andReturn:@"Anonymous"];
[[book.author should] equal:@"Anonymous"];
});
残念ながらこのテストは、
[[book.author should] equal:@"Anonymous"];
の実行でエラーになってしまいます。
このような場合、authorを@protocolで括りだし、そのプロトコルに対してテストを行うのが簡単です。
まず、テストしたいAttributeを含むプロトコルを作成します。
@protocol BookAttributes
@property (nonatomic) NSString *author;
@end
次に、NSManagedObjectを継承したBookクラスでこのプロトコルを実装します。@interface Book : NSManagedObject <BookAttributes>
@end
テストではProtocolのMockを作成し、そのStubを実装します。it(@"foo", ^{
Book *book = [KWMock mockForProtocol:@protocol(BookAttributes)];
[book stub:@selector(author) andReturn:@"Anonymous"];
[[book.author should] equal:@"Anonymouss"];
});
これでNSManagedObject派生クラスが持つAttributeに対してもテストができるようになります。