unit test cellForRowAtIndexPath when using storyBoards

ios, iphone, objective-c, storyboard, unit-testing

Solution

Here is how I test table views and their cells. The key here is to call `beginAppearanceTransition` on view controller in order to load it from the storyboard.

class MyTests: XCTestCase {
  var viewController: UIViewController!

  override func setUp() {
    super.setUp()

    let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
    viewController = storyboard.instantiateViewControllerWithIdentifier("myViewControllerId")
    viewController.beginAppearanceTransition(true, animated: false)
  }

  override func tearDown() {
    super.tearDown()

    viewController.endAppearanceTransition()
  }


  func testShowItemsFromNetwork() {
    //
    // Load the table view here ...
    //

    let tableView = viewController.tableView

    // Check the number of table rows

    XCTAssertEqual(3, tableView.dataSource?.tableView(tableView, numberOfRowsInSection: 0))

    // Check label text of the cell in the first row

    let indexPath = NSIndexPath(forRow: 0, inSection: 0)
    let cell = tableView.dataSource?.tableView(tableView, cellForRowAtIndexPath: indexPath)
    XCTAssertEqual("Test cell title", cell!.textLabel!.text)
  }
}

Problem

If I'm dequeuing a cell from an identifier in a storyboard, how in a unit testing way can I call cellForRowAtIndexPath and not have the cell be nil? ``` - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCell]; cell.guestNameText.text = self.details.guestName; return cell; } ``` Not working, put a break point above after dequeReusableCell is called and cell is nil: ETA: UPDATED WORKING CODE TO PASS THE TEST: ``` - (void)setUp { [super setUp]; _detailVC_SUT = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:kDetailsVC]; _myService = [OCMockObject niceMockForClass:[MyService class]]; _detailVC_SUT.service = _myService; } - (void)test_queryForDetailsSucceeded_should_set_cell_text_fields { [_detailVC_SUT view]; // <--- Need to load the view for this to work Details *details = [DetailsBuilder buildStubDetails]; [_detailVC_SUT queryForDetailsSucceededWithDetails:details]; [self getFirstCellForGuestName]; } - (void)getFirstCellForGuestName { MyCustomTableViewCell *guestNameCell = (MyCustomTableViewCell*)[_detailVC_SUT tableView:_detailVC_SUT.detailsTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; expect(guestNameCell.guestNameText.text).to.equal(@"Mark"); } ```

Original source