Simple problem. I got button which perform segue to next view controller. I want to write UI XCTest to tell me did it open view controller i wanted.
Comment of Matt Green gave me a good idea. We can define an unused label/button, ideally inside a base view controller and assign it an accessibility label to perform a query to find out which view controller is presented.
public class BaseViewController: UIViewController {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
public override func viewDidLoad() {
super.viewDidLoad()
if let identifier = self.theClassName.split(separator: ".").last {
button.accessibilityIdentifier = String(identifier)
view.addSubview(button)
}
}
}
public class DatePickerViewController: BaseViewController {
...
}
func testExample() {
let app = XCUIApplication()
app.launch()
app.navigationBars.buttons["DateSelector"].tap()
XCTAssertTrue(app.buttons["DatePickerViewController"].exists)
}
Note that inorder to make this approach work you have to add the view you use to identify view controller, in this case a button, should be added as a sub view and has to have a non zero frame.