无法通过 RootViewController 评估对视图控制器的 XCTest 引用

XCTest Reference to View Controller not Assessable via RootViewController

我有一个 UIViewController "hierarchy" 这种形式的申请:

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

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

我调用应用程序的 window 来获取根视图控制器,应用程序的选项卡栏控制器:

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

但这只能让我访问对应于每个选项卡的三个视图控制器。我检查了根视图控制器的子视图控制器的数量,数量是 3。有道理。我检查了第三个视图控制器的子视图控制器的数量……零。视图控制器都是通过 IB 设置的。我仍然需要以某种方式访问​​第 4 个视图控制器以进行测试。有没有一种编程方式可以到达第 4 个视图控制器?

晚安的磨合让我得到了答案:

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

selectRowAtIndexPath:animated:scrollPosition:

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

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

以这种方式进行行选择触发了我的 table 视图的委托方法被调用,因此

performSegueWithIdentifier:sender: 

调用了该方法的内部。

负责显示站点详细信息的视图控制器已加载,我能够使用呈现 table 视图控制器的方法获得对它的引用:

let detailViewController = tableViewController.presentedViewController!

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