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"); } ```