2013-12-17 1 views
3

Я пытался проверить segue, который будет представлять контроллер вида. Но всегда это терпит неудачу. Как дождаться завершения segue? Пожалуйста помогите.XCTest, как выполнить segue, который представляет модальный просмотр и тест представленViewController

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

ответ

8

Проблема заключается в том, что вы пытаетесь представить на UIViewController, чье мнение не в UIWindow иерархии. Вот мое решение:

- (void)testExample { 

    // 
    // Arrange 
    // Storyboard 
    // 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

    // 
    // Arrange 
    // View Controller 
    // 
    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
    [UIApplication sharedApplication].keyWindow.rootViewController = viewController; 

    // 
    // Act 
    // 
    [viewController performSegueWithIdentifier:@"ModalSegue" sender:nil]; 

    // 
    // Assert 
    // 
    XCTAssertNotNil(viewController.presentedViewController); 

} 
0

Вы думаете об использовании KIF? Это основанная на Objective-C платформа тестирования пользовательского интерфейса, которая интегрируется с базой Accessibility, встроенной в приложение (как это делает UI Automation). Это делает его идеальным для тестирования пользовательского интерфейса через регулярные рамки тестирования.

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

Или это руководство, чтобы убедиться, что это то, что вы хотите:

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

Надеется, что вы нашли свое решение!

1

Предоставление ответа Swift 3.0, который также использует фреймворк Quick/Nimble и выполняет Segue путем нажатия на кнопку, которая выполняет Segue в пространстве просмотра.

 // 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.shared.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)) 
        }) 
       }) 
      }) 
     }) 
    } 

Для справки кран() метод:

func tap(_ barButtonItem: UIBarButtonItem) { 
     let _ = barButtonItem.target?.perform(barButtonItem.action, with: barButtonItem) 
    } 
Смежные вопросы