XCuenta cómo realizar segue que presente una vista modal y la testing presentada ViewController

Estaba intentando probar un segue que presentaría un controller de vista. Pero, siempre falla. ¿Cómo esperar a que se complete la segue? Por favor asiste.

[self.viewController performSegueWithIdentifier:@"mySegueName" sender:self.viewController]; XCTAssertNotNil(self.viewController.presentedViewController, @"Failed to show modal view"); 

El problema es que está intentando presentar en un UIViewController cuya vista no está en la jerarquía UIWindow . Aquí está mi solución:

 - (void)testExample { // // Arrange // Storyboard // UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; // // Arrange // View Controller // UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; [UIApplication shanetworkingApplication].keyWindow.rootViewController = viewController; // // Act // [viewController performSegueWithIdentifier:@"ModalSegue" sender:nil]; // // Assert // XCTAssertNotNil(viewController.presentedViewController); } 

Proporcionar una respuesta Swift 3.0 que también utiliza el marco Quick / Nimble y realiza el Segue al "tocar" el button que realiza el Segue en el espacio de visualización.

  // Note: there's also a beforeEach {} that sets up the mainViewController describe("navigation") { beforeEach { // Access the view to trigger MainViewController.viewDidLoad(). let _ = mainViewController.view let appDelegate = UIApplication.shanetworking.delegate as! AppDelegate let window = appDelegate.window window?.rootViewController = mainViewController } describe("the views navigationBar", closure: { describe("left bar button item", closure: { context("when pressed", closure: { it("displays SomeViewController", closure: { let item = mainViewController.navigationBar.topItem let addItem = item?.leftBarButtonItem tap(addItem!) expect(mainViewController?.presentedViewController).toEventually(beAnInstanceOf(SomeViewController.self)) }) }) }) }) } 

Para reference, el método tap ():

  func tap(_ barButtonItem: UIBarButtonItem) { let _ = barButtonItem.target?.perform(barButtonItem.action, with: barButtonItem) } 

¿Has pensado en usar KIF? Es un marco de testing de interfaz de usuario basado en Objective-C que se integra con el marco de Accesibilidad integrado en la aplicación (como lo hace la Automatización de interfaz de usuario). Esto lo hace perfecto para las testings de interfaz de usuario a través de los frameworks de testing habituales.

https://github.com/kif-framework/KIF

O siga este tutorial para asegurarse de que es lo que quiere:

http://www.raywenderlich.com/61419/ios-ui-testing-with-kif

Espero que encuentres tu solución!