我試圖嘲笑和測試UITableViewCells,以確保我的configureCell:forIndexPath工作正常,除了我不能讓它使用isKindOfClass工作,但只conformsToProtocol。這將需要我所有的uitableviewcells都有它自己的協議,而且看起來並不需要。嘲笑UITableViewCell和使用isKindOfClass
- (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存根] andReturnValue:OCMOCK_VALUE((BOOL){} YES)] isKindOfClass:[MyTableViewCell類]]]用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。
有沒有辦法做到這一點,或者我必須使用每個tableviewcell協議?在此先感謝
什麼是configureCell方法定義?它是否使用MyTableViewCell *作爲傳遞的單元格? –
MyTableViewCell絕對是UITableViewCell的子類嗎? –
我已經添加了configureCell方法定義,並且是MyTableViewCell絕對是UITableViewCell的一個子類。我使用的是xib,我擴展了UITableViewCell,並將xib中的類名設置爲MyTableViewCell – user2828419