UITableViewCells をモックおよびテストして、configureCell:forIndexPath が正しく動作することを確認しようとしていますが、isKindOfClass を使用して動作させることはできず、conformsToProtocol のみを使用して動作させることはできません。これには、すべての uitableviewcells に独自のプロトコルが必要であり、必要ないようです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FeedObj *item = [_feedElements objectAtIndex:indexPath.row];
if( item.obj_type == FeedObjTypeFriendAdd ) {
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyTableViewCellIdentifier forIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath]
return cell;
} else if( item.obj_type = FeedObjTypeSomeOtherType ) {
// do another cell
}
}
- (void)configureCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
// only enters conditional in test if I do [cell conformsToProtocol:@protocol(SomeIndividualProtocolForEachTableViewcell)]
if( [cell isKindOfClass:[MyTableViewCell class]] ) {
// do the configuring
FeedObj *item = [_streamElements objectAtIndex:indexPath.row];
NSString *firstName = [item.obj_data objectForKey:@"first_name"];
NSString *lastName = [item.obj_data objectForKey:@"last_name"];
NSString *name = [NSString stringWithFormat:@"%@ %@.", firstName, [lastName substringToIndex:1]];
NSString *text = [NSString stringWithFormat:@"%@ has joined", name];
[((MyTableViewCell *)cell).messageLabel setText:text];
} else if( [cell isKindOfClass[SomeOtherTableView class]] ) {
// do other config
}
}
@implementation SampleTests
- (void)setUp
{
_controller = [[MySampleViewController alloc] init];
_tableViewMock = [OCMockObject niceMockForClass:[UITableView class]];
[_tableViewMock registerNib:[UINib nibWithNibName:@"MyTableViewCell" bundle:nil] forCellReuseIdentifier:MyTableViewCellIdentifier];
}
- (void)testFriendAddCell
{
FeedObj *friendAdd = [[FeedObj alloc] init];
friendAdd.obj_type = FeedObjTypeFriendAdd;
friendAdd.obj_data = [NSMutableDictionary dictionaryWithDictionary:@{ @"first_name" : @"firstname", @"last_name" : @"lastname" }];
_mockStreamElements = [NSMutableArray arrayWithObject:friendAdd];
[_controller setValue:_mockStreamElements forKey:@"_feedElements"];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[[[_tableViewMock expect] andReturn:[[[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil] lastObject]] dequeueReusableCellWithIdentifier:MyTableViewCellIdentifier forIndexPath:indexPath];
MyTableViewCell *cell = (MyTableViewCell *)[_controller tableView:_tableViewMock cellForRowAtIndexPath:indexPath];
STAssertNotNil( cell, @"should not be nil" );
STAssertTrue( [cell.messageLabel.text isEqualToString:@"firstname l. has joined"], @"should be equal" );
[_tableViewMock verify];
}
@end
また、 [[[mockCell stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[MyTableViewCell class]]] を mockCell 期待値で実行しようとしましたが、どちらも機能しません。このような:
id mockCell = [OCMockObject partialMockForObject:[[[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil] lastObject]];
[[[mockCell stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[OCMConstraint isKindOfClass:[MyTableViewCell class]]];
[[[_tableViewMock expect] andReturn:mockCell] dequeueReusableCellWithIdentifier:MyTableViewCellIdentifier forIndexPath:indexPath];
http://blog.carbonfive.com/2009/02/17/custom-constraints-for-ocmock/にリストされている OCMConstraint を試してみました。
これを行う方法はありますか、それともテーブルビューセルごとにプロトコルを使用する必要がありますか? 前もって感謝します