XCTest对View Controller的引用无法通过RootViewController进行评估

时间:2015-12-10 05:05:07

标签: ios swift uitableview uiviewcontroller xctest

我有UIViewController"层次结构"这种形式:

标签栏控制器 - 查看控制器1 - 查看控制器2 - 查看控制器3   *查看控制器4

我正在使用XCTest框架为我的iOS应用程序编写测试方法。视图控制器3是UITableViewController。当用户选择表格中的行时,显示视图控制器4。

我调用应用程序的窗口来获取根视图控制器,即应用程序的标签栏控制器:

// get reference to the tab bar controller
let tabBarController = UIApplication.sharedApplication().delegate!.window!!.rootViewController! as! UITabBarController

但这只能让我访问与每个标签对应的三个视图控制器。我检查了根视图控制器的子视图控制器的数量,数量是3.有道理。我检查了第三个视图控制器的子视图控制器的数量...零。视图控制器都是通过IB设置的。我仍然需要以某种方式访问​​第四个视图控制器进行测试。有没有一种程序化的方式来达到第四个视图控制器?

1 个答案:

答案 0 :(得分:0)

晚安的磨练让我得到答案:

在我的测试代码中,我使用以下方法在UITableView上进行调用:

selectRowAtIndexPath:动画:的scrollPosition:

但该方法调用不会触发UITableViewSelectionDidChangeNotification通知发布。由于我的应用程序代码确实使用了依赖于该通知发布的UITableView委托函数,所以我只是这样做了:

// get reference to the table view
let tableView = tableViewController.view.viewWithTag(300)! as! UITableView
tableView.delegate!.tableView!(tableView, didSelectRowAtIndexPath: indexPath)

以这种方式进行行选择会触发我要调用的表视图的委托方法,从而触发

performSegueWithIdentifier:sender: 
该方法的内部被调用。

负载显示站点详细信息的视图控制器已加载,我可以使用呈现表视图控制器的方法获取对它的引用:

let detailViewController = tableViewController.presentedViewController!

这似乎有效,到目前为止我很满意......