私の単体テストの1つが失敗していて、予期していなかった理由があります。の呼び出しisKindOfClass
がNOを返しているようですが、デバッグしてステップスルーすると、そうなる理由はないようです。
コードは次のとおりです。
if ([self.detailItem isKindOfClass:[MovieInfo class]]) {
[self configureViewForMovie];
}
私はコードをステップスルーし、次のことを行いました。
po self.detailItem
表示されるもの:
(id) $1 = 0x0ea8f390 <MovieInfo: 0xea8f390>
では、何が欠けているのでしょうか。この場合、ifステートメントがfalseを返すのはなぜですか。
編集:
DetailItemのセッターは次のとおりです。
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
NSLog(@"%@", [newDetailItem class]);
_detailItem = newDetailItem;
// Update the view.
[self configureView];
}
if (self.masterPopoverController != nil) {
[self.masterPopoverController dismissPopoverAnimated:YES];
}
}
これは、マスター詳細テンプレートのテンプレートコードです。
単体テストは、setUpにMovieInfoを作成します。
movie = [[MovieInfo alloc] initWithMovieName:@"Movie" movieID:1];
テストに設定します
controller.detailItem = movie;
さらに、次の場所にパラメータアサーションを追加しましたsetDetailItem
。
NSParameterAssert([newDetailItem isKindOfClass:[MovieInfo class]] || [newDetailItem isKindOfClass:[PersonInfo class]] || newDetailItem == nil);
このアサーションも失敗しています。
アサーション呼び出しの上に2つのログステートメントを配置しました。
NSLog(@"%@", [newDetailItem class]);
NSLog(@"%@", newDetailItem);
どの表示:
2012-08-28 08:31:37.574 Popcorn[8006:c07] MovieInfo
2012-08-28 08:31:38.253 Popcorn[8006:c07] <MovieInfo: 0x6daac50>
もう1つの編集:
isKindOfClass
ユニットテストで設定する前にチェックを追加しました。これは合格です。
if ([movie isKindOfClass:[MovieInfo class]]) {
NSLog(@"Yep"); //This passes and prints out
}
controller.detailItem = movie; //calls into the setter and fails.