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

2013/05/20

既存gitリポジトリで、親の存在しないbranchを作成する

gitでbranchを作成するには、git branch、またはgit checkout -bを使いますが、稀に、他のcommitから派生していない、すなわち親の存在しないbranchを作りたいことがあります。

例えば、既存branchで各種実装検討を行い、方向性が見えたあとで、 新規にcommitを組み直したい、といった場合です。また、ソースコードの新規公開へむけて、過去の履歴を含まないbranchを新規に作成したい場合にも使えるかもしれません。

このためには、次のコマンドが使えます
git checkout --orphan <branch-name>
これで親のいない、まさにorphanなbranchを作ることができます。

なお、このコマンドを実行してもworking treeへ含まれているファイルは消えません。