使用storyBoards时单元测试cellForRowAtIndexPath
Posted
技术标签:
【中文标题】使用storyBoards时单元测试cellForRowAtIndexPath【英文标题】:unit test cellForRowAtIndexPath when using storyBoards 【发布时间】:2013-07-25 17:17:05 【问题描述】:如果我从情节提要中的标识符中取出一个单元格,我如何以单元测试的方式调用 cellForRowAtIndexPath 并且不让单元格为零?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
MyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCustomCell];
cell.guestNameText.text = self.details.guestName;
return cell;
不行,在dequeReusableCell被调用且cell为nil之后在上面放一个断点:
ETA:更新的工作代码以通过测试:
- (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");
【问题讨论】:
在您的测试中,视图是否真正被加载? 是的,刚刚添加了 [_detailVC_SUT 视图];但它仍然显示为 guestCell 为零。更新完整代码 在调用 view 加载视图后现在可以工作了,缺少了,但现在可以工作了,感谢 Wain 的建议! 【参考方案1】:这是我测试表格视图及其单元格的方法。这里的关键是在视图控制器上调用beginAppearanceTransition
以便从情节提要中加载它。
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)
【讨论】:
在执行 cellForRow() 之前,我必须使用 tableView.reloadData()。除此之外,您的答案是正确的:) 我很难找到这个beginAppearanceTransition
。谢谢。【参考方案2】:
表格视图在尝试调用 cellForRow(at:) 时有一个 CGRect.zero 框架。结果,cellForRow(at:) 返回 nil。为了对其进行测试,我在您的测试函数中执行了以下操作:
func testCellForRow_AtZero_ReturnsTaskCell()
let mockTableView = UITableView(frame: CGRect(x: 0, y: 0, width: 320, height: 480), style: .plain)
mockTableView.dataSource = dataSource
mockTableView.register(YourTableViewCell.self, forCellReuseIdentifier: String(describing: YourTableViewCell.self))
//The reload is also necessary
mockTableView.reloadData()
let cell = mockTableView.cellForRow(at: IndexPath(row: 0, section: 0))
XCTAssertTrue(cell is YourTableViewCell)
不要忘记,在您的数据源中,您应该为 Indexpath(row: 0, section: 0) 设置一个值。否则测试会失败。
【讨论】:
以上是关于使用storyBoards时单元测试cellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章
子类化 UITableViewCell 并在 Storyboard 中使用它
使用 Storyboard 的 Swift 动态表格视图单元格高度
如何让 Storyboard 支持 UICollectionView 中动态大小的单元格?
使用 Storyboard 中的 UITableViewCell 时使用 alloc 和 init
iPhone-如何将 Storyboard 与自定义 UITableView 单元格和 CellWithIdentifier 一起使用