使用storyBoards时unit testingcellForRowAtIndexPath
如果我从故事板中的标识符中出列单元格,那么在unit testing方式中如何调用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"); }
以下是我测试表视图及其单元格的方法。 这里的关键是在视图控制器上调用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(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) }
不要忘记在dataSource中你应该有一个Indexpath的值(row:0,section:0)。 否则测试将失败。
- 子类的代表?
- 如何在不使用redirectSafari浏览器的iOS应用程序中集成Facebook与最新的FBSDK
- SecCertificateRef:如何获取证书信息?
- 在UIWebView中embedded图像和UILable
- InAppPurchase在删除并重新安装应用程序后停止接收productRequest响应
- 我可以使用UITextFields的用户名和密码信息自动登录UIWebView中的网站吗?
- 应用程序在iPhone 5.1模拟器和iOS 5.1的真实iPhone 4上performance不同
- 如何在iPhone中将XML读取为XML
- 无法将应用程序提交到App Store:“将API使用情况发送到iTunes Connect”超时或失去连接