【问题标题】:XCTest how to perform segue that present a modal view and test presentedViewControllerXCTest 如何执行 segue 呈现模态视图并测试presentedViewController
【发布时间】:2013-12-17 10:49:09
【问题描述】:

我试图测试一个可以呈现视图控制器的 segue。但是,总是失败。如何等待segue完成?请帮忙。

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

【问题讨论】:

    标签: ios objective-c xcode unit-testing xctest


    【解决方案1】:

    问题是您试图在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);
    
    }
    

    【讨论】:

      【解决方案2】:

      提供一个 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))
                          })
                      })
                  })
              })
          }
      

      参考 tap() 方法:

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

      【讨论】:

        【解决方案3】:

        您是否考虑过使用 KIF?它是一个基于 Objective-C 的 UI 测试框架,它与内置于应用程序的 Accessibility 框架集成(就像 UI 自动化所做的那样)。这使得它非常适合通过常规测试框架进行 UI 测试。

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

        或者按照这个教程来确保它是你想要的:

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

        希望您能找到解决方案!

        【讨论】:

          猜你喜欢
          • 2014-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 2015-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多