2013/05/23

KiwiでNSManagedObject派生クラスへstubを設定する

KiwiはiOSでBDDを実施するためのライブラリです。Mock作成の仕組みなどが組み込まれており、他ライブラリを別途インストールすることなく、素早くテストを行うことができます。

但し、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に対してもテストができるようになります。

0 件のコメント:

コメントを投稿