2015-04-15 1 views
0

Я использую Kiwi для написания тестов для приложения. Я пытаюсь проверить, что ячейка, возвращаемая с tableView:cellForRowAtIndexPath:, имеет правильные значения, установленные после вызова. Я сделал УНЧ различных вариаций этого не повезло:Kiwi BDD - Как проверить результаты `tableView: cellForRowAtIndexPath:`? (Objective-C)

describe(@"tableView:cellForRowAtIndexPath:", ^{ 

    it(@"Should return a cell with proper label values", 
    ^{ 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     id mockTableView = [UITableView mock]; 
     id mockCell = [UITableViewCell mock]; 
     [mockTableView stub:@selector(dequeueReusableCellWithIdentifier:forIndexPath:) andReturn:mockCell withArguments:any(), indexPath]; 
     [mockCell stub:@selector(label1) 
      andReturn:[[UILabel alloc] init]]; 
     [mockCell stub:@selector(label2) 
      andReturn:[UILabel alloc]]; 

     CustomTableViewCell *cell = (CustomTableViewCell *) 
      [dataSource tableView:mockTableView 
        cellForRowAtIndexPath:indexPath]; 

     [[cell.label1.text should] 
      equal:@"abc"]; 
     [[cell.label2.text should] equal:@"xyz"]; 

    }); 

}); 

Фактический метод выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomTableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:kCustomCellReuseIdentifier 
             forIndexPath:indexPath]; 
    CustomObject *obj = [self objAtIndexPath:indexPath]; 

    [self setupCell:cell withObj:obj]; 

    return cell; 
} 

- (void)setupCell:(
CustomTableViewCell *)cell withObj:(CustomObject *)obj 
    { 
     cell.label1.text = @"abc"; 
     cell.label2.text = @"xyz"; 
    } 

кажется попасться на cell.label1 быть nil - однако, я оставьте это раньше.

Любые мысли о том, как на самом деле написать этот тест, приветствуются.

+0

'cell.label1' nil внутри' setupCell: 'или в модульном тесте? – Cristik

+0

В setupCell я вижу, что это nil –

+0

Вы должны попробовать насмешку 'CustomTableViewCell' вместо' UITableViewCell', так как 'UITableViewCell' не имеет селектора' label1', и поэтому вызов 'stub' может ничего не делать. Также вы выполняете stubbing как возвращаемое значение a [[[UILabel alloc] init] ', что означает, что при создании« метки »создается другая метка. – Cristik

ответ

0

Если вы создаете экземпляр CustomTableViewController программно с помощью раскадровки, вам не нужно будет устанавливать метки в пользовательской ячейке, если они подключены как выходы. Тем не менее, это выглядит, как вы можете строить пользовательский интерфейс ячейки программно, так что просто инициализировать этикетки на издевались CustomCell как и перед запуском тестового воздействия:

describe(@"CustomTableViewControllerTest", ^{ 
    __block CustomTableViewController *controller; 

    beforeEach(^{ 
     controller = [[CustomTableViewController alloc] initWithStyle:UITableViewStylePlain]; 
     controller.tableView = [[UITableView alloc] init]; 
    }); 

    describe(@"tableView:cellForRowAtIndexPath:", ^{ 
     it(@"Should return a cell with proper label values", ^{ 
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
      CustomTableViewCell *mockCell = [[CustomTableViewCell alloc] init]; 
      mockCell.label1 = [[UILabel alloc] init]; 
      mockCell.label2 = [[UILabel alloc] init]; 
      [controller.tableView stub:@selector(dequeueReusableCellWithIdentifier:forIndexPath:) andReturn:mockCell withArguments:any(), indexPath]; 
      CustomTableViewCell *cell = (CustomTableViewCell *)[controller tableView:controller.tableView cellForRowAtIndexPath:indexPath]; 
      [[cell.label1.text should] equal:@"abc"]; 
      [[cell.label2.text should] equal:@"xyz"]; 
     }); 
    }); 
}); 

Помните, что не все должно быть издеваться. На самом деле, я считаю, что лучше притворяться как можно меньше при написании тестов, потому что он заставляет ваши объекты отвечать за правильное поведение после создания. Я провел это локально, и он прошел.

0

Как вы тестируете классы UIKit, вы видели the Kiwi wiki page, в котором указано следующее?

Спецификации, которые выполняют операции над классами UIKit (например, UILabels), вероятно, будут разбиты странно, если они будут запущены ничем, кроме теста приложения. Чтобы узнать больше о том, как настроить целевую аудиторию приложения, проверьте official Apple docs.

Похоже, что вы можете убедиться, что тестовая цель - это тест приложения, в отличие от логического теста.

 Смежные вопросы

  • Нет связанных вопросов^_^